Abyssal Wiki
abyssalwiki
https://abyssal.miraheze.org/wiki/Main_Page
MediaWiki 1.40.1
first-letter
Media
Special
Talk
User
User talk
Abyssal Wiki
Abyssal Wiki talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Campaign
Campaign talk
Module
Module talk
Main Page
0
1
1
2023-09-24T14:08:42Z
MediaWiki default
1
Create main page
wikitext
text/x-wiki
__NOTOC__
== Welcome to {{SITENAME}}! ==
This Main Page was created automatically and it seems it hasn't been replaced yet.
=== For the bureaucrat(s) of this wiki ===
Hello, and welcome to your new wiki! Thank you for choosing Miraheze for the hosting of your wiki, we hope you will enjoy our hosting.
You can immediately start working on your wiki or whenever you want.
Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links:
* [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users)
* [[meta:Special:MyLanguage/FAQ|Miraheze FAQ]]
* [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.)
==== I still don't understand X! ====
Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here:
* [[meta:Special:MyLanguage/Help center|On our own Miraheze wiki]]
* On [[phab:|Phabricator]]
* On [https://miraheze.org/discord Discord]
* On IRC in #miraheze on irc.libera.chat ([irc://irc.libera.chat/%23miraheze direct link]; [https://web.libera.chat/?channel=#miraheze webchat])
=== For visitors of this wiki ===
Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later!
21236ac3f8d65e5563b6da6b70815ca6bf1e6616
4
1
2023-09-24T15:19:11Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="text-align:center">Abyssal is a Roblox cooperative obby game developed by nextReality Studios.<div style="padding-top:7px">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. Help us by contributing today!</div>
fabe51617d0303b84e2679a1a74c7304c29aa0fe
7
4
2023-09-24T16:25:34Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="text-align:center">Abyssal is a Roblox cooperative obby game developed by nextReality Studios.<div style="padding-top:7px">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</div></div>
<!--{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}
{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}
{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}
{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}
{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}
{| class="wikitable" style="float:left;width:20%"
! [[Characters]]
|-
| 1<br>2
|}-->
9d8c18231caad88ace24a575ad72c8785ebf5b79
17
7
2023-10-06T16:07:42Z
Silentg
2
draft
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:73%">
<p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p>
<p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p>New to the game? Here are a few pages that might be useful for you:</p>
<div></div>
</div>
8fe8e17a3761b0b5ead26f4ca5875bf2ee881e28
18
17
2023-10-06T16:14:11Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%">
<p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p>
<p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:1px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p>New to the game? Here are a few pages that might be useful for you:</p>
<div></div>
</div>
1625be05acef5f86c18721db16e711429f349e8a
19
18
2023-10-06T16:20:50Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%">
<p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p>
<p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:1px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p>New to the game? Here are a few pages that might be useful for you:</p>
<div></div>
</div>
c69dd683313841ef511df07a429b9df8a16e322e
20
19
2023-10-06T16:39:01Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p>
<p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:3px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;max-width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Items]]</li>
<li>[[Characters]]</li>
</ul>
</div>
0429909a723e3081cb1ab62e9f53de636da32116
21
20
2023-10-06T16:52:30Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;max-width:74%">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
<p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:0px 0px 0px 2px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:2px 0px 0px 0px;max-width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Items]]</li>
<li>[[Characters]]</li>
</ul>
</div>
a9a3e1c8b41d8fd08c8634da90bb81b66dac21c2
MediaWiki:Mainpage-title
8
2
2
2023-09-24T15:15:37Z
Silentg
2
Created page with "-"
wikitext
text/x-wiki
-
3bc15c8aae3e4124dd409035f32ea2fd6835efc9
9
2
2023-09-25T13:32:51Z
Silentg
2
wikitext
text/x-wiki
a
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
10
9
2023-09-25T13:33:05Z
Silentg
2
Blanked the page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
MediaWiki:Mainpage-title-loggedin
8
3
3
2023-09-24T15:16:07Z
Silentg
2
Created page with "-"
wikitext
text/x-wiki
-
3bc15c8aae3e4124dd409035f32ea2fd6835efc9
5
3
2023-09-24T15:20:16Z
Silentg
2
wikitext
text/x-wiki
Abyssal Wiki
08ac98cc12fb510dbdad6059b653fa60890b7af7
6
5
2023-09-24T15:20:44Z
Silentg
2
Blanked the page
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
User:Silentg
2
4
8
2023-09-25T13:31:26Z
Silentg
2
Created page with "Hello!"
wikitext
text/x-wiki
Hello!
69342c5c39e5ae5f0077aecc32c0f81811fb8193
User:Silentg/common.css
2
5
11
2023-09-28T07:07:15Z
Silentg
2
Created page with "body { background-color: #24244b; }"
css
text/css
body {
background-color: #24244b;
}
0415815ff940e0a5c5d3407faa684bb21e33f99c
12
11
2023-09-28T07:07:45Z
Silentg
2
Silentg moved page [[User:Silentg/Common.css]] to [[User:Silentg/common.css]] without leaving a redirect
css
text/css
body {
background-color: #24244b;
}
0415815ff940e0a5c5d3407faa684bb21e33f99c
13
12
2023-09-28T07:09:18Z
Silentg
2
css
text/css
body {
background-size: cover;
background-color: #24244b;
}
baf761b78705daa7c9ca195bdc7e0c5af13458d2
14
13
2023-09-28T07:12:43Z
Silentg
2
css
text/css
body {
background-size: cover;
background-color: #24244b;
}
#mw-page-base {
background: none;
}
8e18210be5fbba32e48685368c0582d8969155fe
15
14
2023-09-28T07:15:54Z
Silentg
2
css
text/css
body {
background: no-repeat center center fixed;
background-size: cover;
background-color: #24244b;
}
#mw-page-base {
background: none;
}
1fe69673e695daac6d4ffb503692fd7d7faf6ea2
16
15
2023-09-28T09:56:59Z
Silentg
2
css
text/css
body {
background: no-repeat center center fixed;
background-size: cover;
background-color: #24244b;
}
#mw-page-base {
background: none;
}
#p-cactions ul li, #p-cactions ul li a {
border-top-left-radius: 1em;
border-top-right-radius: 1em;
}
#content {
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
}
.pBody {
border-top-right-radius: 1em;
border-bottom-right-radius: 1em;
}
546a9a14ce32bc8d5771d38a7a5d5156b1e04182
Module:Infobox
828
6
22
2023-10-07T13:54:14Z
Silentg
2
Copied from Wikipedia
Scribunto
text/plain
-- copied from Wikipedia
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local lists = {
plainlist_t = {
patterns = {
'^plainlist$',
'%splainlist$',
'^plainlist%s',
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
},
hlist_t = {
patterns = {
'^hlist$',
'%shlist$',
'^hlist%s',
'%shlist%s'
},
found = false,
styles = 'Hlist/styles.css'
}
}
local function has_list_class(args_to_check)
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
has_list_class({ args.aboveclass })
root
:tag('tr')
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
has_list_class({ args.belowclass })
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if args.decat == 'yes' then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
local hlist_templatestyles = ''
if lists.hlist_t.found then
hlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.hlist_t.styles }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because the rows of interest invoking
-- each class may not be on a specific page
hlist_templatestyles,
plainlist_templatestyles,
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
e82a67c885068bdb7894e38699935058a1825e56
Template:Infobox
10
7
23
2023-10-07T13:56:52Z
Silentg
2
Copied from Wikipedia
wikitext
text/x-wiki
{{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
817a9f5b6524eced06a57bd1d5fd7179f9369bf2
Module:Infobox/styles.css
828
8
24
2023-10-07T14:00:46Z
Silentg
2
Created page with "/* copied from Wikipedia */ /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox..."
sanitized-css
text/css
/* copied from Wikipedia */
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
}
.infobox-3cols-child {
margin: auto;
}
.infobox .navbar {
font-size: 100%;
}
/* T281642 */
body.skin-minerva .infobox-header,
body.skin-minerva .infobox-subheader,
body.skin-minerva .infobox-above,
body.skin-minerva .infobox-title,
body.skin-minerva .infobox-image,
body.skin-minerva .infobox-full-data,
body.skin-minerva .infobox-below {
text-align: center;
}
5a78c86e35a2e25712bf20a318203ae686a1906a
Template:Documentation
10
9
25
2023-10-07T14:03:38Z
Silentg
2
Copied from Wikipedia
wikitext
text/x-wiki
{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}<noinclude>
<!-- Add categories to the /doc subpage -->
</noinclude>
9e62b964e96c4e3d478edecbfcb3c0338ae8a276
Module:Documentation
828
10
26
2023-10-07T14:05:53Z
Silentg
2
Created page with "-- copied from Wikipedia -- This module implements {{documentation}}. -- Get required modules. local getArgs = require('Module:Arguments').getArgs -- Get the config table. local cfg = mw.loadData('Module:Documentation/config') local p = {} -- Often-used functions. local ugsub = mw.ustring.gsub local format = mw.ustring.format ---------------------------------------------------------------------------- -- Helper functions -- -- These are defined as local functions,..."
Scribunto
text/plain
-- copied from Wikipedia
-- This module implements {{documentation}}.
-- Get required modules.
local getArgs = require('Module:Arguments').getArgs
-- Get the config table.
local cfg = mw.loadData('Module:Documentation/config')
local p = {}
-- Often-used functions.
local ugsub = mw.ustring.gsub
local format = mw.ustring.format
----------------------------------------------------------------------------
-- Helper functions
--
-- These are defined as local functions, but are made available in the p
-- table for testing purposes.
----------------------------------------------------------------------------
local function message(cfgKey, valArray, expectType)
--[[
-- Gets a message from the cfg table and formats it if appropriate.
-- The function raises an error if the value from the cfg table is not
-- of the type expectType. The default type for expectType is 'string'.
-- If the table valArray is present, strings such as $1, $2 etc. in the
-- message are substituted with values from the table keys [1], [2] etc.
-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',
-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."
--]]
local msg = cfg[cfgKey]
expectType = expectType or 'string'
if type(msg) ~= expectType then
error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)
end
if not valArray then
return msg
end
local function getMessageVal(match)
match = tonumber(match)
return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)
end
return ugsub(msg, '$([1-9][0-9]*)', getMessageVal)
end
p.message = message
local function makeWikilink(page, display)
if display then
return format('[[%s|%s]]', page, display)
else
return format('[[%s]]', page)
end
end
p.makeWikilink = makeWikilink
local function makeCategoryLink(cat, sort)
local catns = mw.site.namespaces[14].name
return makeWikilink(catns .. ':' .. cat, sort)
end
p.makeCategoryLink = makeCategoryLink
local function makeUrlLink(url, display)
return format('[%s %s]', url, display)
end
p.makeUrlLink = makeUrlLink
local function makeToolbar(...)
local ret = {}
local lim = select('#', ...)
if lim < 1 then
return nil
end
for i = 1, lim do
ret[#ret + 1] = select(i, ...)
end
-- 'documentation-toolbar'
return format(
'<span class="%s">(%s)</span>',
message('toolbar-class'),
table.concat(ret, ' | ')
)
end
p.makeToolbar = makeToolbar
----------------------------------------------------------------------------
-- Argument processing
----------------------------------------------------------------------------
local function makeInvokeFunc(funcName)
return function (frame)
local args = getArgs(frame, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = value:match('^%s*(.-)%s*$') -- Remove whitespace.
if key == 'heading' or value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
return p[funcName](args)
end
end
----------------------------------------------------------------------------
-- Entry points
----------------------------------------------------------------------------
function p.nonexistent(frame)
if mw.title.getCurrentTitle().subpageText == 'testcases' then
return frame:expandTemplate{title = 'module test cases notice'}
else
return p.main(frame)
end
end
p.main = makeInvokeFunc('_main')
function p._main(args)
--[[
-- This function defines logic flow for the module.
-- @args - table of arguments passed by the user
--]]
local env = p.getEnvironment(args)
local root = mw.html.create()
root
:wikitext(p._getModuleWikitext(args, env))
:wikitext(p.protectionTemplate(env))
:wikitext(p.sandboxNotice(args, env))
:tag('div')
-- 'documentation-container'
:addClass(message('container'))
:attr('role', 'complementary')
:attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil)
:attr('aria-label', args.heading == '' and 'Documentation' or nil)
:newline()
:tag('div')
-- 'documentation'
:addClass(message('main-div-classes'))
:newline()
:wikitext(p._startBox(args, env))
:wikitext(p._content(args, env))
:tag('div')
-- 'documentation-clear'
:addClass(message('clear'))
:done()
:newline()
:done()
:wikitext(p._endBox(args, env))
:done()
:wikitext(p.addTrackingCategories(env))
-- 'Module:Documentation/styles.css'
return mw.getCurrentFrame():extensionTag (
'templatestyles', '', {src=cfg['templatestyles']
}) .. tostring(root)
end
----------------------------------------------------------------------------
-- Environment settings
----------------------------------------------------------------------------
function p.getEnvironment(args)
--[[
-- Returns a table with information about the environment, including title
-- objects and other namespace- or path-related data.
-- @args - table of arguments passed by the user
--
-- Title objects include:
-- env.title - the page we are making documentation for (usually the current title)
-- env.templateTitle - the template (or module, file, etc.)
-- env.docTitle - the /doc subpage.
-- env.sandboxTitle - the /sandbox subpage.
-- env.testcasesTitle - the /testcases subpage.
--
-- Data includes:
-- env.protectionLevels - the protection levels table of the title object.
-- env.subjectSpace - the number of the title's subject namespace.
-- env.docSpace - the number of the namespace the title puts its documentation in.
-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.
-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.
--
-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value
-- returned will be nil.
--]]
local env, envFuncs = {}, {}
-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value
-- returned by that function is memoized in the env table so that we don't call any of the functions
-- more than once. (Nils won't be memoized.)
setmetatable(env, {
__index = function (t, key)
local envFunc = envFuncs[key]
if envFunc then
local success, val = pcall(envFunc)
if success then
env[key] = val -- Memoise the value.
return val
end
end
return nil
end
})
function envFuncs.title()
-- The title object for the current page, or a test page passed with args.page.
local title
local titleArg = args.page
if titleArg then
title = mw.title.new(titleArg)
else
title = mw.title.getCurrentTitle()
end
return title
end
function envFuncs.templateTitle()
--[[
-- The template (or module, etc.) title object.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
-- 'testcases-subpage' --> 'testcases'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local subpage = title.subpageText
if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then
return mw.title.makeTitle(subjectSpace, title.baseText)
else
return mw.title.makeTitle(subjectSpace, title.text)
end
end
function envFuncs.docTitle()
--[[
-- Title object of the /doc subpage.
-- Messages:
-- 'doc-subpage' --> 'doc'
--]]
local title = env.title
local docname = args[1] -- User-specified doc page.
local docpage
if docname then
docpage = docname
else
docpage = env.docpageBase .. '/' .. message('doc-subpage')
end
return mw.title.new(docpage)
end
function envFuncs.sandboxTitle()
--[[
-- Title object for the /sandbox subpage.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage'))
end
function envFuncs.testcasesTitle()
--[[
-- Title object for the /testcases subpage.
-- Messages:
-- 'testcases-subpage' --> 'testcases'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage'))
end
function envFuncs.protectionLevels()
-- The protection levels table of the title object.
return env.title.protectionLevels
end
function envFuncs.subjectSpace()
-- The subject namespace number.
return mw.site.namespaces[env.title.namespace].subject.id
end
function envFuncs.docSpace()
-- The documentation namespace number. For most namespaces this is the
-- same as the subject namespace. However, pages in the Article, File,
-- MediaWiki or Category namespaces must have their /doc, /sandbox and
-- /testcases pages in talk space.
local subjectSpace = env.subjectSpace
if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then
return subjectSpace + 1
else
return subjectSpace
end
end
function envFuncs.docpageBase()
-- The base page of the /doc, /sandbox, and /testcases subpages.
-- For some namespaces this is the talk page, rather than the template page.
local templateTitle = env.templateTitle
local docSpace = env.docSpace
local docSpaceText = mw.site.namespaces[docSpace].name
-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.
return docSpaceText .. ':' .. templateTitle.text
end
function envFuncs.compareUrl()
-- Diff link between the sandbox and the main template using [[Special:ComparePages]].
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
if templateTitle.exists and sandboxTitle.exists then
local compareUrl = mw.uri.canonicalUrl(
'Special:ComparePages',
{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}
)
return tostring(compareUrl)
else
return nil
end
end
return env
end
----------------------------------------------------------------------------
-- Auxiliary templates
----------------------------------------------------------------------------
p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext')
function p._getModuleWikitext(args, env)
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.contentModel ~= 'Scribunto' then return end
pcall(require, currentTitle.prefixedText) -- if it fails, we don't care
local moduleWikitext = package.loaded["Module:Module wikitext"]
if moduleWikitext then
return moduleWikitext.main()
end
end
function p.sandboxNotice(args, env)
--[=[
-- Generates a sandbox notice for display above sandbox pages.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]'
-- 'sandbox-notice-blurb' --> 'This is the $1 for $2.'
-- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).'
-- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page'
-- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page'
-- 'sandbox-notice-pagetype-other' --> 'sandbox page'
-- 'sandbox-notice-compare-link-display' --> 'diff'
-- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.'
-- 'sandbox-notice-testcases-link-display' --> 'test cases'
-- 'sandbox-category' --> 'Template sandboxes'
--]=]
local title = env.title
local sandboxTitle = env.sandboxTitle
local templateTitle = env.templateTitle
local subjectSpace = env.subjectSpace
if not (subjectSpace and title and sandboxTitle and templateTitle
and mw.title.equals(title, sandboxTitle)) then
return nil
end
-- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text".
local omargs = {}
omargs.image = message('sandbox-notice-image')
-- Get the text. We start with the opening blurb, which is something like
-- "This is the template sandbox for [[Template:Foo]] (diff)."
local text = ''
local pagetype
if subjectSpace == 10 then
pagetype = message('sandbox-notice-pagetype-template')
elseif subjectSpace == 828 then
pagetype = message('sandbox-notice-pagetype-module')
else
pagetype = message('sandbox-notice-pagetype-other')
end
local templateLink = makeWikilink(templateTitle.prefixedText)
local compareUrl = env.compareUrl
if compareUrl then
local compareDisplay = message('sandbox-notice-compare-link-display')
local compareLink = makeUrlLink(compareUrl, compareDisplay)
text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink})
else
text = text .. message('sandbox-notice-blurb', {pagetype, templateLink})
end
-- Get the test cases page blurb if the page exists. This is something like
-- "See also the companion subpage for [[Template:Foo/testcases|test cases]]."
local testcasesTitle = env.testcasesTitle
if testcasesTitle and testcasesTitle.exists then
if testcasesTitle.contentModel == "Scribunto" then
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink})
else
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink})
end
end
-- Add the sandbox to the sandbox category.
omargs.text = text .. makeCategoryLink(message('sandbox-category'))
-- 'documentation-clear'
return '<div class="' .. message('clear') .. '"></div>'
.. require('Module:Message box').main('ombox', omargs)
end
function p.protectionTemplate(env)
-- Generates the padlock icon in the top right.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'protection-template' --> 'pp-template'
-- 'protection-template-args' --> {docusage = 'yes'}
local protectionLevels = env.protectionLevels
if not protectionLevels then
return nil
end
local editProt = protectionLevels.edit and protectionLevels.edit[1]
local moveProt = protectionLevels.move and protectionLevels.move[1]
if editProt then
-- The page is edit-protected.
return require('Module:Protection banner')._main{
message('protection-reason-edit'), small = true
}
elseif moveProt and moveProt ~= 'autoconfirmed' then
-- The page is move-protected but not edit-protected. Exclude move
-- protection with the level "autoconfirmed", as this is equivalent to
-- no move protection at all.
return require('Module:Protection banner')._main{
action = 'move', small = true
}
else
return nil
end
end
----------------------------------------------------------------------------
-- Start box
----------------------------------------------------------------------------
p.startBox = makeInvokeFunc('_startBox')
function p._startBox(args, env)
--[[
-- This function generates the start box.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make
-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox
-- which generate the box HTML.
--]]
env = env or p.getEnvironment(args)
local links
local content = args.content
if not content or args[1] then
-- No need to include the links if the documentation is on the template page itself.
local linksData = p.makeStartBoxLinksData(args, env)
if linksData then
links = p.renderStartBoxLinks(linksData)
end
end
-- Generate the start box html.
local data = p.makeStartBoxData(args, env, links)
if data then
return p.renderStartBox(data)
else
-- User specified no heading.
return nil
end
end
function p.makeStartBoxLinksData(args, env)
--[[
-- Does initial processing of data to make the [view] [edit] [history] [purge] links.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'view-link-display' --> 'view'
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'purge-link-display' --> 'purge'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'docpage-preload' --> 'Template:Documentation/preload'
-- 'create-link-display' --> 'create'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local docTitle = env.docTitle
if not title or not docTitle then
return nil
end
if docTitle.isRedirect then
docTitle = docTitle.redirectTarget
end
-- Create link if /doc doesn't exist.
local preload = args.preload
if not preload then
if subjectSpace == 828 then -- Module namespace
preload = message('module-preload')
else
preload = message('docpage-preload')
end
end
return {
title = title,
docTitle = docTitle,
-- View, display, edit, and purge links if /doc exists.
viewLinkDisplay = message('view-link-display'),
editLinkDisplay = message('edit-link-display'),
historyLinkDisplay = message('history-link-display'),
purgeLinkDisplay = message('purge-link-display'),
preload = preload,
createLinkDisplay = message('create-link-display')
}
end
function p.renderStartBoxLinks(data)
--[[
-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.
-- @data - a table of data generated by p.makeStartBoxLinksData
--]]
local docTitle = data.docTitle
-- yes, we do intend to purge the template page on which the documentation appears
local purgeLink = makeWikilink("Special:Purge/" .. data.title.prefixedText, data.purgeLinkDisplay)
if docTitle.exists then
local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, data.editLinkDisplay)
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, data.historyLinkDisplay)
return "[" .. viewLink .. "] [" .. editLink .. "] [" .. historyLink .. "] [" .. purgeLink .. "]"
else
local createLink = makeUrlLink(docTitle:canonicalUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay)
return "[" .. createLink .. "] [" .. purgeLink .. "]"
end
return ret
end
function p.makeStartBoxData(args, env, links)
--[=[
-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.
--
-- Messages:
-- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- 'template-namespace-heading' --> 'Template documentation'
-- 'module-namespace-heading' --> 'Module documentation'
-- 'file-namespace-heading' --> 'Summary'
-- 'other-namespaces-heading' --> 'Documentation'
-- 'testcases-create-link-display' --> 'create'
--]=]
local subjectSpace = env.subjectSpace
if not subjectSpace then
-- Default to an "other namespaces" namespace, so that we get at least some output
-- if an error occurs.
subjectSpace = 2
end
local data = {}
-- Heading
local heading = args.heading -- Blank values are not removed.
if heading == '' then
-- Don't display the start box if the heading arg is defined but blank.
return nil
end
if heading then
data.heading = heading
elseif subjectSpace == 10 then -- Template namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading')
elseif subjectSpace == 828 then -- Module namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading')
elseif subjectSpace == 6 then -- File namespace
data.heading = message('file-namespace-heading')
else
data.heading = message('other-namespaces-heading')
end
-- Heading CSS
local headingStyle = args['heading-style']
if headingStyle then
data.headingStyleText = headingStyle
else
-- 'documentation-heading'
data.headingClass = message('main-div-heading-class')
end
-- Data for the [view][edit][history][purge] or [create] links.
if links then
-- 'mw-editsection-like plainlinks'
data.linksClass = message('start-box-link-classes')
data.links = links
end
return data
end
function p.renderStartBox(data)
-- Renders the start box html.
-- @data - a table of data generated by p.makeStartBoxData.
local sbox = mw.html.create('div')
sbox
-- 'documentation-startbox'
:addClass(message('start-box-class'))
:newline()
:tag('span')
:addClass(data.headingClass)
:attr('id', 'documentation-heading')
:cssText(data.headingStyleText)
:wikitext(data.heading)
local links = data.links
if links then
sbox:tag('span')
:addClass(data.linksClass)
:attr('id', data.linksId)
:wikitext(links)
end
return tostring(sbox)
end
----------------------------------------------------------------------------
-- Documentation content
----------------------------------------------------------------------------
p.content = makeInvokeFunc('_content')
function p._content(args, env)
-- Displays the documentation contents
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
local content = args.content
if not content and docTitle and docTitle.exists then
content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}
end
-- The line breaks below are necessary so that "=== Headings ===" at the start and end
-- of docs are interpreted correctly.
return '\n' .. (content or '') .. '\n'
end
p.contentTitle = makeInvokeFunc('_contentTitle')
function p._contentTitle(args, env)
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
if not args.content and docTitle and docTitle.exists then
return docTitle.prefixedText
else
return ''
end
end
----------------------------------------------------------------------------
-- End box
----------------------------------------------------------------------------
p.endBox = makeInvokeFunc('_endBox')
function p._endBox(args, env)
--[=[
-- This function generates the end box (also known as the link box).
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
--]=]
-- Get environment data.
env = env or p.getEnvironment(args)
local subjectSpace = env.subjectSpace
local docTitle = env.docTitle
if not subjectSpace or not docTitle then
return nil
end
-- Check whether we should output the end box at all. Add the end
-- box by default if the documentation exists or if we are in the
-- user, module or template namespaces.
local linkBox = args['link box']
if linkBox == 'off'
or not (
docTitle.exists
or subjectSpace == 2
or subjectSpace == 828
or subjectSpace == 10
)
then
return nil
end
-- Assemble the link box.
local text = ''
if linkBox then
text = text .. linkBox
else
text = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]."
if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then
-- We are in the user, template or module namespaces.
-- Add sandbox and testcases links.
-- "Editors can experiment in this template's sandbox and testcases pages."
text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />'
if not args.content and not args[1] then
-- "Please add categories to the /doc subpage."
-- Don't show this message with inline docs or with an explicitly specified doc page,
-- as then it is unclear where to add the categories.
text = text .. (p.makeCategoriesBlurb(args, env) or '')
end
text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template"
end
end
local box = mw.html.create('div')
-- 'documentation-metadata'
box:attr('role', 'note')
:addClass(message('end-box-class'))
-- 'plainlinks'
:addClass(message('end-box-plainlinks'))
:wikitext(text)
:done()
return '\n' .. tostring(box)
end
function p.makeDocPageBlurb(args, env)
--[=[
-- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)".
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'transcluded-from-blurb' -->
-- 'The above [[Wikipedia:Template documentation|documentation]]
-- is [[Help:Transclusion|transcluded]] from $1.'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'create-link-display' --> 'create'
-- 'create-module-doc-blurb' -->
-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
--]=]
local docTitle = env.docTitle
if not docTitle then
return nil
end
local ret
if docTitle.exists then
-- /doc exists; link to it.
local docLink = makeWikilink(docTitle.prefixedText)
local editDisplay = message('edit-link-display')
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay)
local historyDisplay = message('history-link-display')
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, historyDisplay)
ret = message('transcluded-from-blurb', {docLink})
.. ' '
.. makeToolbar(editLink, historyLink)
.. '<br />'
elseif env.subjectSpace == 828 then
-- /doc does not exist; ask to create it.
local createUrl = docTitle:canonicalUrl{action = 'edit', preload = message('module-preload')}
local createDisplay = message('create-link-display')
local createLink = makeUrlLink(createUrl, createDisplay)
ret = message('create-module-doc-blurb', {createLink})
.. '<br />'
end
return ret
end
function p.makeExperimentBlurb(args, env)
--[[
-- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-link-display' --> 'sandbox'
-- 'sandbox-edit-link-display' --> 'edit'
-- 'compare-link-display' --> 'diff'
-- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'sandbox-create-link-display' --> 'create'
-- 'mirror-edit-summary' --> 'Create sandbox version of $1'
-- 'mirror-link-display' --> 'mirror'
-- 'mirror-link-preload' --> 'Template:Documentation/mirror'
-- 'sandbox-link-display' --> 'sandbox'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display'--> 'edit'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'testcases-create-link-display' --> 'create'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display' --> 'edit'
-- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases'
-- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases'
-- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.'
-- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
local testcasesTitle = env.testcasesTitle
local templatePage = templateTitle.prefixedText
if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then
return nil
end
-- Make links.
local sandboxLinks, testcasesLinks
if sandboxTitle.exists then
local sandboxPage = sandboxTitle.prefixedText
local sandboxDisplay = message('sandbox-link-display')
local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)
local sandboxEditDisplay = message('sandbox-edit-link-display')
local sandboxEditLink = makeWikilink("Special:EditPage/" .. sandboxPage, sandboxEditDisplay)
local compareUrl = env.compareUrl
local compareLink
if compareUrl then
local compareDisplay = message('compare-link-display')
compareLink = makeUrlLink(compareUrl, compareDisplay)
end
sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink)
else
local sandboxPreload
if subjectSpace == 828 then
sandboxPreload = message('module-sandbox-preload')
else
sandboxPreload = message('template-sandbox-preload')
end
local sandboxCreateUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = sandboxPreload}
local sandboxCreateDisplay = message('sandbox-create-link-display')
local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)
local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)})
local mirrorPreload = message('mirror-link-preload')
local mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}
if subjectSpace == 828 then
mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary}
end
local mirrorDisplay = message('mirror-link-display')
local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)
sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink)
end
if testcasesTitle.exists then
local testcasesPage = testcasesTitle.prefixedText
local testcasesDisplay = message('testcases-link-display')
local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)
local testcasesEditUrl = testcasesTitle:canonicalUrl{action = 'edit'}
local testcasesEditDisplay = message('testcases-edit-link-display')
local testcasesEditLink = makeWikilink("Special:EditPage/" .. testcasesPage, testcasesEditDisplay)
-- for Modules, add testcases run link if exists
if testcasesTitle.contentModel == "Scribunto" and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then
local testcasesRunLinkDisplay = message('testcases-run-link-display')
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink)
else
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink)
end
else
local testcasesPreload
if subjectSpace == 828 then
testcasesPreload = message('module-testcases-preload')
else
testcasesPreload = message('template-testcases-preload')
end
local testcasesCreateUrl = testcasesTitle:canonicalUrl{action = 'edit', preload = testcasesPreload}
local testcasesCreateDisplay = message('testcases-create-link-display')
local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)
testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink)
end
local messageName
if subjectSpace == 828 then
messageName = 'experiment-blurb-module'
else
messageName = 'experiment-blurb-template'
end
return message(messageName, {sandboxLinks, testcasesLinks})
end
function p.makeCategoriesBlurb(args, env)
--[[
-- Generates the text "Please add categories to the /doc subpage."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'doc-link-display' --> '/doc'
-- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.'
--]]
local docTitle = env.docTitle
if not docTitle then
return nil
end
local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display'))
return message('add-categories-blurb', {docPathLink})
end
function p.makeSubpagesBlurb(args, env)
--[[
-- Generates the "Subpages of this template" link.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'template-pagetype' --> 'template'
-- 'module-pagetype' --> 'module'
-- 'default-pagetype' --> 'page'
-- 'subpages-link-display' --> 'Subpages of this $1'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
if not subjectSpace or not templateTitle then
return nil
end
local pagetype
if subjectSpace == 10 then
pagetype = message('template-pagetype')
elseif subjectSpace == 828 then
pagetype = message('module-pagetype')
else
pagetype = message('default-pagetype')
end
local subpagesLink = makeWikilink(
'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/',
message('subpages-link-display', {pagetype})
)
return message('subpages-blurb', {subpagesLink})
end
----------------------------------------------------------------------------
-- Tracking categories
----------------------------------------------------------------------------
function p.addTrackingCategories(env)
--[[
-- Check if {{documentation}} is transcluded on a /doc or /testcases page.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'display-strange-usage-category' --> true
-- 'doc-subpage' --> 'doc'
-- 'testcases-subpage' --> 'testcases'
-- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage'
--
-- /testcases pages in the module namespace are not categorised, as they may have
-- {{documentation}} transcluded automatically.
--]]
local title = env.title
local subjectSpace = env.subjectSpace
if not title or not subjectSpace then
return nil
end
local subpage = title.subpageText
local ret = ''
if message('display-strange-usage-category', nil, 'boolean')
and (
subpage == message('doc-subpage')
or subjectSpace ~= 828 and subpage == message('testcases-subpage')
)
then
ret = ret .. makeCategoryLink(message('strange-usage-category'))
end
return ret
end
return p
7f2383ffe6646997daca35086aa243111f9c811c
Module:Documentation/doc
828
11
27
2023-10-07T14:08:09Z
Silentg
2
Copied from Wikipedia
wikitext
text/x-wiki
{{used in system}}
{{Module rating|protected}}
{{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}}
{{Uses TemplateStyles|Module:Documentation/styles.css}}
This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it.
== Normal usage ==
For most uses, you should use the {{tl|documentation}} template; please see that template's page for its usage instructions and parameters.
== Use in other modules ==
To use this module from another Lua module, first load it with <code>require</code>:
<syntaxhighlight lang="lua">
local documentation = require('Module:Documentation').main
</syntaxhighlight>
Then you can simply call it using a table of arguments.
<syntaxhighlight lang="lua">
documentation{content = 'Some documentation', ['link box'] = 'My custom link box'}
</syntaxhighlight>
Please refer to the [[Template:Documentation/doc|template documentation]] for usage instructions and a list of parameters.
== Porting to other wikis ==
The module has a configuration file at [[Module:Documentation/config]] which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. If you have any questions, or you need a feature which is not currently implemented, please leave a message at <span class="plainlinks">[https://en.wikipedia.org/wiki/Template_talk:Documentation Template talk:Documentation]</span><!-- this link uses external link syntax because it is intended to direct users from third-party wikis to the Wikipedia template talk page; in this situation, an internal link would unhelpfully just point to their local template talk page, and the existence of any given interwiki prefix cannot be assumed --> to get the attention of a developer.
The messages that need to be customized to display a documentation template/module at the top of module pages are [[MediaWiki:Scribunto-doc-page-show]] and [[MediaWiki:Scribunto-doc-page-does-not-exist]].
66a5c1cb6e80e28fd79c6c4544ecf09ced7a6360
Module:Documentation/config
828
12
28
2023-10-07T14:09:01Z
Silentg
2
Created page with "---------------------------------------------------------------------------------------------------- -- -- Configuration for Module:Documentation -- -- Here you can set the values of the parameters and messages used in Module:Documentation to -- localise it to your wiki and your language. Unless specified otherwise, values given here -- should be string values. ---------------------------------------------------------------------------------..."
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
--
-- Configuration for Module:Documentation
--
-- Here you can set the values of the parameters and messages used in Module:Documentation to
-- localise it to your wiki and your language. Unless specified otherwise, values given here
-- should be string values.
----------------------------------------------------------------------------------------------------
local cfg = {} -- Do not edit this line.
----------------------------------------------------------------------------------------------------
-- Protection template configuration
----------------------------------------------------------------------------------------------------
-- cfg['protection-reason-edit']
-- The protection reason for edit-protected templates to pass to
-- [[Module:Protection banner]].
cfg['protection-reason-edit'] = 'template'
--[[
----------------------------------------------------------------------------------------------------
-- Sandbox notice configuration
--
-- On sandbox pages the module can display a template notifying users that the current page is a
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a
-- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the
-- messages that the notices contains.
----------------------------------------------------------------------------------------------------
--]]
-- cfg['sandbox-notice-image']
-- The image displayed in the sandbox notice.
cfg['sandbox-notice-image'] = '[[File:Sandbox.svg|50px|alt=|link=]]'
--[[
-- cfg['sandbox-notice-pagetype-template']
-- cfg['sandbox-notice-pagetype-module']
-- cfg['sandbox-notice-pagetype-other']
-- The page type of the sandbox page. The message that is displayed depends on the current subject
-- namespace. This message is used in either cfg['sandbox-notice-blurb'] or
-- cfg['sandbox-notice-diff-blurb'].
--]]
cfg['sandbox-notice-pagetype-template'] = '[[Wikipedia:Template test cases|template sandbox]] page'
cfg['sandbox-notice-pagetype-module'] = '[[Wikipedia:Template test cases|module sandbox]] page'
cfg['sandbox-notice-pagetype-other'] = 'sandbox page'
--[[
-- cfg['sandbox-notice-blurb']
-- cfg['sandbox-notice-diff-blurb']
-- cfg['sandbox-notice-diff-display']
-- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page
-- type, which is either cfg['sandbox-notice-pagetype-template'],
-- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between
-- the sandbox and the main template. The display value of the diff link is set by
-- cfg['sandbox-notice-compare-link-display'].
--]]
cfg['sandbox-notice-blurb'] = 'This is the $1 for $2.'
cfg['sandbox-notice-diff-blurb'] = 'This is the $1 for $2 ($3).'
cfg['sandbox-notice-compare-link-display'] = 'diff'
--[[
-- cfg['sandbox-notice-testcases-blurb']
-- cfg['sandbox-notice-testcases-link-display']
-- cfg['sandbox-notice-testcases-run-blurb']
-- cfg['sandbox-notice-testcases-run-link-display']
-- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.
-- cfg['sandbox-notice-testcases-link-display'] is the display value for that link.
-- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test
-- cases page, and $2 is a link to the page to run it.
-- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test
-- cases.
--]]
cfg['sandbox-notice-testcases-blurb'] = 'See also the companion subpage for $1.'
cfg['sandbox-notice-testcases-link-display'] = 'test cases'
cfg['sandbox-notice-testcases-run-blurb'] = 'See also the companion subpage for $1 ($2).'
cfg['sandbox-notice-testcases-run-link-display'] = 'run'
-- cfg['sandbox-category']
-- A category to add to all template sandboxes.
cfg['sandbox-category'] = 'Template sandboxes'
----------------------------------------------------------------------------------------------------
-- Start box configuration
----------------------------------------------------------------------------------------------------
-- cfg['documentation-icon-wikitext']
-- The wikitext for the icon shown at the top of the template.
cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- cfg['template-namespace-heading']
-- The heading shown in the template namespace.
cfg['template-namespace-heading'] = 'Template documentation'
-- cfg['module-namespace-heading']
-- The heading shown in the module namespace.
cfg['module-namespace-heading'] = 'Module documentation'
-- cfg['file-namespace-heading']
-- The heading shown in the file namespace.
cfg['file-namespace-heading'] = 'Summary'
-- cfg['other-namespaces-heading']
-- The heading shown in other namespaces.
cfg['other-namespaces-heading'] = 'Documentation'
-- cfg['view-link-display']
-- The text to display for "view" links.
cfg['view-link-display'] = 'view'
-- cfg['edit-link-display']
-- The text to display for "edit" links.
cfg['edit-link-display'] = 'edit'
-- cfg['history-link-display']
-- The text to display for "history" links.
cfg['history-link-display'] = 'history'
-- cfg['purge-link-display']
-- The text to display for "purge" links.
cfg['purge-link-display'] = 'purge'
-- cfg['create-link-display']
-- The text to display for "create" links.
cfg['create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Link box (end box) configuration
----------------------------------------------------------------------------------------------------
-- cfg['transcluded-from-blurb']
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.
cfg['transcluded-from-blurb'] = 'The above [[Wikipedia:Template documentation|documentation]] is [[Help:Transclusion|transcluded]] from $1.'
--[[
-- cfg['create-module-doc-blurb']
-- Notice displayed in the module namespace when the documentation subpage does not exist.
-- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the
-- display cfg['create-link-display'].
--]]
cfg['create-module-doc-blurb'] = 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
----------------------------------------------------------------------------------------------------
-- Experiment blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['experiment-blurb-template']
-- cfg['experiment-blurb-module']
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.
-- It is only shown in the template and module namespaces. With the default English settings, it
-- might look like this:
--
-- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages.
--
-- In this example, "sandbox", "edit", "diff", "testcases", and "edit" would all be links.
--
-- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending
-- on what namespace we are in.
--
-- Parameters:
--
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display'])
--
-- If the sandbox doesn't exist, it is in the format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display'])
--
-- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload']
-- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display']
-- loads a default edit summary of cfg['mirror-edit-summary'].
--
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:
--
-- cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display'])
--
-- If the test cases page doesn't exist, it is in the format:
--
-- cfg['testcases-link-display'] (cfg['testcases-create-link-display'])
--
-- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the
-- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current
-- namespace.
--]]
cfg['experiment-blurb-template'] = "Editors can experiment in this template's $1 and $2 pages."
cfg['experiment-blurb-module'] = "Editors can experiment in this module's $1 and $2 pages."
----------------------------------------------------------------------------------------------------
-- Sandbox link configuration
----------------------------------------------------------------------------------------------------
-- cfg['sandbox-subpage']
-- The name of the template subpage typically used for sandboxes.
cfg['sandbox-subpage'] = 'sandbox'
-- cfg['template-sandbox-preload']
-- Preload file for template sandbox pages.
cfg['template-sandbox-preload'] = 'Template:Documentation/preload-sandbox'
-- cfg['module-sandbox-preload']
-- Preload file for Lua module sandbox pages.
cfg['module-sandbox-preload'] = 'Template:Documentation/preload-module-sandbox'
-- cfg['sandbox-link-display']
-- The text to display for "sandbox" links.
cfg['sandbox-link-display'] = 'sandbox'
-- cfg['sandbox-edit-link-display']
-- The text to display for sandbox "edit" links.
cfg['sandbox-edit-link-display'] = 'edit'
-- cfg['sandbox-create-link-display']
-- The text to display for sandbox "create" links.
cfg['sandbox-create-link-display'] = 'create'
-- cfg['compare-link-display']
-- The text to display for "compare" links.
cfg['compare-link-display'] = 'diff'
-- cfg['mirror-edit-summary']
-- The default edit summary to use when a user clicks the "mirror" link. $1 is a wikilink to the
-- template page.
cfg['mirror-edit-summary'] = 'Create sandbox version of $1'
-- cfg['mirror-link-display']
-- The text to display for "mirror" links.
cfg['mirror-link-display'] = 'mirror'
-- cfg['mirror-link-preload']
-- The page to preload when a user clicks the "mirror" link.
cfg['mirror-link-preload'] = 'Template:Documentation/mirror'
----------------------------------------------------------------------------------------------------
-- Test cases link configuration
----------------------------------------------------------------------------------------------------
-- cfg['testcases-subpage']
-- The name of the template subpage typically used for test cases.
cfg['testcases-subpage'] = 'testcases'
-- cfg['template-testcases-preload']
-- Preload file for template test cases pages.
cfg['template-testcases-preload'] = 'Template:Documentation/preload-testcases'
-- cfg['module-testcases-preload']
-- Preload file for Lua module test cases pages.
cfg['module-testcases-preload'] = 'Template:Documentation/preload-module-testcases'
-- cfg['testcases-link-display']
-- The text to display for "testcases" links.
cfg['testcases-link-display'] = 'testcases'
-- cfg['testcases-edit-link-display']
-- The text to display for test cases "edit" links.
cfg['testcases-edit-link-display'] = 'edit'
-- cfg['testcases-run-link-display']
-- The text to display for test cases "run" links.
cfg['testcases-run-link-display'] = 'run'
-- cfg['testcases-create-link-display']
-- The text to display for test cases "create" links.
cfg['testcases-create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Add categories blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['add-categories-blurb']
-- Text to direct users to add categories to the /doc subpage. Not used if the "content" or
-- "docname fed" arguments are set, as then it is not clear where to add the categories. $1 is a
-- link to the /doc subpage with a display value of cfg['doc-link-display'].
--]]
cfg['add-categories-blurb'] = 'Add categories to the $1 subpage.'
-- cfg['doc-link-display']
-- The text to display when linking to the /doc subpage.
cfg['doc-link-display'] = '/doc'
----------------------------------------------------------------------------------------------------
-- Subpages link configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['subpages-blurb']
-- The "Subpages of this template" blurb. $1 is a link to the main template's subpages with a
-- display value of cfg['subpages-link-display']. In the English version this blurb is simply
-- the link followed by a period, and the link display provides the actual text.
--]]
cfg['subpages-blurb'] = '$1.'
--[[
-- cfg['subpages-link-display']
-- The text to display for the "subpages of this page" link. $1 is cfg['template-pagetype'],
-- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in
-- the template namespace, the module namespace, or another namespace.
--]]
cfg['subpages-link-display'] = 'Subpages of this $1'
-- cfg['template-pagetype']
-- The pagetype to display for template pages.
cfg['template-pagetype'] = 'template'
-- cfg['module-pagetype']
-- The pagetype to display for Lua module pages.
cfg['module-pagetype'] = 'module'
-- cfg['default-pagetype']
-- The pagetype to display for pages other than templates or Lua modules.
cfg['default-pagetype'] = 'page'
----------------------------------------------------------------------------------------------------
-- Doc link configuration
----------------------------------------------------------------------------------------------------
-- cfg['doc-subpage']
-- The name of the subpage typically used for documentation pages.
cfg['doc-subpage'] = 'doc'
-- cfg['docpage-preload']
-- Preload file for template documentation pages in all namespaces.
cfg['docpage-preload'] = 'Template:Documentation/preload'
-- cfg['module-preload']
-- Preload file for Lua module documentation pages.
cfg['module-preload'] = 'Template:Documentation/preload-module-doc'
----------------------------------------------------------------------------------------------------
-- HTML and CSS configuration
----------------------------------------------------------------------------------------------------
-- cfg['templatestyles']
-- The name of the TemplateStyles page where CSS is kept.
-- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed.
cfg['templatestyles'] = 'Module:Documentation/styles.css'
-- cfg['container']
-- Class which can be used to set flex or grid CSS on the
-- two child divs documentation and documentation-metadata
cfg['container'] = 'documentation-container'
-- cfg['main-div-classes']
-- Classes added to the main HTML "div" tag.
cfg['main-div-classes'] = 'documentation'
-- cfg['main-div-heading-class']
-- Class for the main heading for templates and modules and assoc. talk spaces
cfg['main-div-heading-class'] = 'documentation-heading'
-- cfg['start-box-class']
-- Class for the start box
cfg['start-box-class'] = 'documentation-startbox'
-- cfg['start-box-link-classes']
-- Classes used for the [view][edit][history] or [create] links in the start box.
-- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]]
cfg['start-box-link-classes'] = 'mw-editsection-like plainlinks'
-- cfg['end-box-class']
-- Class for the end box.
cfg['end-box-class'] = 'documentation-metadata'
-- cfg['end-box-plainlinks']
-- Plainlinks
cfg['end-box-plainlinks'] = 'plainlinks'
-- cfg['toolbar-class']
-- Class added for toolbar links.
cfg['toolbar-class'] = 'documentation-toolbar'
-- cfg['clear']
-- Just used to clear things.
cfg['clear'] = 'documentation-clear'
----------------------------------------------------------------------------------------------------
-- Tracking category configuration
----------------------------------------------------------------------------------------------------
-- cfg['display-strange-usage-category']
-- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage
-- or a /testcases subpage. This should be a boolean value (either true or false).
cfg['display-strange-usage-category'] = true
-- cfg['strange-usage-category']
-- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a
-- /doc subpage or a /testcases subpage.
cfg['strange-usage-category'] = 'Wikipedia pages with strange ((documentation)) usage'
--[[
----------------------------------------------------------------------------------------------------
-- End configuration
--
-- Don't edit anything below this line.
----------------------------------------------------------------------------------------------------
--]]
return cfg
71b68ed73088f1a59d61acf06bbee9fde6677f03
Module:Documentation/config/doc
828
13
29
2023-10-07T14:09:33Z
Silentg
2
Created page with "{{used in system}} {{module rating|protected}} This is the configuration file for [[Module:Documentation]]. This file can be edited to allow easy translation/porting of the module to other wikis."
wikitext
text/x-wiki
{{used in system}}
{{module rating|protected}}
This is the configuration file for [[Module:Documentation]]. This file can be edited to allow easy translation/porting of the module to other wikis.
e6010669e50ed6237542d13cd028b458ec2e21c7
Module:Arguments
828
14
30
2023-10-07T14:11:59Z
Silentg
2
Created page with "-- copied from Wikipedia -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val)..."
Scribunto
text/plain
-- copied from Wikipedia
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
d0445e40a7e608105092c8347d85a72da7fa5a7b
Module:Documentation/styles.css
828
15
31
2023-10-07T14:12:59Z
Silentg
2
Created page with "/* {{pp|small=yes}} */ .documentation, .documentation-metadata { border: 1px solid #a2a9b1; background-color: #ecfcf4; clear: both; } .documentation { margin: 1em 0 0 0; padding: 1em; } .documentation-metadata { margin: 0.2em 0; /* same margin left-right as .documentation */ font-style: italic; padding: 0.4em 1em; /* same padding left-right as .documentation */ } .documentation-startbox { padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bott..."
sanitized-css
text/css
/* {{pp|small=yes}} */
.documentation,
.documentation-metadata {
border: 1px solid #a2a9b1;
background-color: #ecfcf4;
clear: both;
}
.documentation {
margin: 1em 0 0 0;
padding: 1em;
}
.documentation-metadata {
margin: 0.2em 0; /* same margin left-right as .documentation */
font-style: italic;
padding: 0.4em 1em; /* same padding left-right as .documentation */
}
.documentation-startbox {
padding-bottom: 3px;
border-bottom: 1px solid #aaa;
margin-bottom: 1ex;
}
.documentation-heading {
font-weight: bold;
font-size: 125%;
}
.documentation-clear { /* Don't want things to stick out where they shouldn't. */
clear: both;
}
.documentation-toolbar {
font-style: normal;
font-size: 85%;
}
ce0e629c92e3d825ab9fd927fe6cc37d9117b6cb
Template:Documentation/doc
10
16
32
2023-10-07T14:13:30Z
Silentg
2
Created page with "{{used in system}} {{Module rating|protected}} {{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}} {{Uses TemplateStyles|Module:Documentation/styles.css}} This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it. == Normal usage == For most uses, you should use the {{tl|documenta..."
wikitext
text/x-wiki
{{used in system}}
{{Module rating|protected}}
{{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}}
{{Uses TemplateStyles|Module:Documentation/styles.css}}
This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it.
== Normal usage ==
For most uses, you should use the {{tl|documentation}} template; please see that template's page for its usage instructions and parameters.
== Use in other modules ==
To use this module from another Lua module, first load it with <code>require</code>:
<syntaxhighlight lang="lua">
local documentation = require('Module:Documentation').main
</syntaxhighlight>
Then you can simply call it using a table of arguments.
<syntaxhighlight lang="lua">
documentation{content = 'Some documentation', ['link box'] = 'My custom link box'}
</syntaxhighlight>
Please refer to the [[Template:Documentation/doc|template documentation]] for usage instructions and a list of parameters.
== Porting to other wikis ==
The module has a configuration file at [[Module:Documentation/config]] which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. If you have any questions, or you need a feature which is not currently implemented, please leave a message at <span class="plainlinks">[https://en.wikipedia.org/wiki/Template_talk:Documentation Template talk:Documentation]</span><!-- this link uses external link syntax because it is intended to direct users from third-party wikis to the Wikipedia template talk page; in this situation, an internal link would unhelpfully just point to their local template talk page, and the existence of any given interwiki prefix cannot be assumed --> to get the attention of a developer.
The messages that need to be customized to display a documentation template/module at the top of module pages are [[MediaWiki:Scribunto-doc-page-show]] and [[MediaWiki:Scribunto-doc-page-does-not-exist]].
66a5c1cb6e80e28fd79c6c4544ecf09ced7a6360
Module:Arguments/doc
828
17
33
2023-10-07T14:16:42Z
Silentg
2
Created page with "{{Used in system}} {{Module rating|p}} This module provides easy processing of arguments passed from <code>#invoke</code>. It is a meta-module, meant for use by other modules, and should not be called from <code>#invoke</code> directly (for a module directly invocable by templates you might want to have a look at {{ml|params|}}). Its features include: * Easy trimming of arguments and removal of blank arguments. * Arguments can be passed by both the current frame and by..."
wikitext
text/x-wiki
{{Used in system}}
{{Module rating|p}}
This module provides easy processing of arguments passed from <code>#invoke</code>. It is a meta-module, meant for use by other modules, and should not be called from <code>#invoke</code> directly (for a module directly invocable by templates you might want to have a look at {{ml|params|}}). Its features include:
* Easy trimming of arguments and removal of blank arguments.
* Arguments can be passed by both the current frame and by the parent frame at the same time. (More details below.)
* Arguments can be passed in directly from another Lua module or from the debug console.
* Most features can be customized.
== Basic use ==
First, you need to load the module. It contains one function, named <code>getArgs</code>.
<syntaxhighlight lang="lua">
local getArgs = require('Module:Arguments').getArgs
</syntaxhighlight>
In the most basic scenario, you can use getArgs inside your main function. The variable <code>args</code> is a table containing the arguments from #invoke. (See below for details.)
<syntaxhighlight lang="lua">
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame)
-- Main module code goes here.
end
return p
</syntaxhighlight>
=== Recommended practice ===
However, the recommended practice is to use a function just for processing arguments from #invoke. This means that if someone calls your module from another Lua module you don't have to have a frame object available, which improves performance.
<syntaxhighlight lang="lua">
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
-- Main module code goes here.
end
return p
</syntaxhighlight>
The way this is called from a template is <code><nowiki>{{#invoke:Example|main}}</nowiki></code> (optionally with some parameters like <code><nowiki>{{#invoke:Example|main|arg1=value1|arg2=value2}}</nowiki></code>), and the way this is called from a module is <syntaxhighlight lang=lua inline>require('Module:Example')._main({arg1 = 'value1', arg2 = value2, 'spaced arg3' = 'value3'})</syntaxhighlight>. What this second one does is construct a table with the arguments in it, then gives that table to the p._main(args) function, which uses it natively.
=== Multiple functions ===
If you want multiple functions to use the arguments, and you also want them to be accessible from #invoke, you can use a wrapper function.
<syntaxhighlight lang="lua">
local getArgs = require('Module:Arguments').getArgs
local p = {}
local function makeInvokeFunc(funcName)
return function (frame)
local args = getArgs(frame)
return p[funcName](args)
end
end
p.func1 = makeInvokeFunc('_func1')
function p._func1(args)
-- Code for the first function goes here.
end
p.func2 = makeInvokeFunc('_func2')
function p._func2(args)
-- Code for the second function goes here.
end
return p
</syntaxhighlight>
=== Options ===
The following options are available. They are explained in the sections below.
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
trim = false,
removeBlanks = false,
valueFunc = function (key, value)
-- Code for processing one argument
end,
frameOnly = true,
parentOnly = true,
parentFirst = true,
wrappers = {
'Template:A wrapper template',
'Template:Another wrapper template'
},
readOnly = true,
noOverwrite = true
})
</syntaxhighlight>
=== Trimming and removing blanks ===
Blank arguments often trip up coders new to converting MediaWiki templates to Lua. In template syntax, blank strings and strings consisting only of whitespace are considered false. However, in Lua, blank strings and strings consisting of whitespace are considered true. This means that if you don't pay attention to such arguments when you write your Lua modules, you might treat something as true that should actually be treated as false. To avoid this, by default this module removes all blank arguments.
Similarly, whitespace can cause problems when dealing with positional arguments. Although whitespace is trimmed for named arguments coming from #invoke, it is preserved for positional arguments. Most of the time this additional whitespace is not desired, so this module trims it off by default.
However, sometimes you want to use blank arguments as input, and sometimes you want to keep additional whitespace. This can be necessary to convert some templates exactly as they were written. If you want to do this, you can set the <code>trim</code> and <code>removeBlanks</code> arguments to <code>false</code>.
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
trim = false,
removeBlanks = false
})
</syntaxhighlight>
=== Custom formatting of arguments ===
Sometimes you want to remove some blank arguments but not others, or perhaps you might want to put all of the positional arguments in lower case. To do things like this you can use the <code>valueFunc</code> option. The input to this option must be a function that takes two parameters, <code>key</code> and <code>value</code>, and returns a single value. This value is what you will get when you access the field <code>key</code> in the <code>args</code> table.
Example 1: this function preserves whitespace for the first positional argument's value, but trims all other arguments' value and removes all other blank arguments.
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
valueFunc = function (key, value)
if key == 1 then
return value
elseif value then
value = mw.text.trim(value)
if value ~= '' then
return value
end
end
return nil
end
})
</syntaxhighlight>
Example 2: this function removes blank arguments and converts all argument values to lower case, but doesn't trim whitespace from positional parameters.
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
valueFunc = function (key, value)
if not value then
return nil
end
value = mw.ustring.lower(value)
if mw.ustring.find(value, '%S') then
return value
end
return nil
end
})
</syntaxhighlight>
Note: the above functions will fail if passed input that is not of type <code>string</code> or <code>nil</code>. This might be the case if you use the <code>getArgs</code> function in the main function of your module, and that function is called by another Lua module. In this case, you will need to check the type of your input. This is not a problem if you are using a function specially for arguments from #invoke (i.e. you have <code>p.main</code> and <code>p._main</code> functions, or something similar).
{{cot|Examples 1 and 2 with type checking}}
Example 1:
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
valueFunc = function (key, value)
if key == 1 then
return value
elseif type(value) == 'string' then
value = mw.text.trim(value)
if value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
</syntaxhighlight>
Example 2:
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = mw.ustring.lower(value)
if mw.ustring.find(value, '%S') then
return value
else
return nil
end
else
return value
end
end
})
</syntaxhighlight>
{{cob}}
Also, please note that the <code>valueFunc</code> function is called more or less every time an argument is requested from the <code>args</code> table, so if you care about performance you should make sure you aren't doing anything inefficient with your code.
=== Frames and parent frames ===
Arguments in the <code>args</code> table can be passed from the current frame or from its parent frame at the same time. To understand what this means, it is easiest to give an example. Let's say that we have a module called <code>Module:ExampleArgs</code>. This module prints the first two positional arguments that it is passed.
{{cot|Module:ExampleArgs code}}
<syntaxhighlight lang="lua">
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
function p._main(args)
local first = args[1] or ''
local second = args[2] or ''
return first .. ' ' .. second
end
return p
</syntaxhighlight>
{{cob}}
<code>Module:ExampleArgs</code> is then called by <code>Template:ExampleArgs</code>, which contains the code <code><nowiki>{{#invoke:ExampleArgs|main|firstInvokeArg}}</nowiki></code>. This produces the result "firstInvokeArg".
Now if we were to call <code>Template:ExampleArgs</code>, the following would happen:
{| class="wikitable" style="width: 50em; max-width: 100%;"
|-
! style="width: 60%;" | Code
! style="width: 40%;" | Result
|-
| <code><nowiki>{{ExampleArgs}}</nowiki></code>
| firstInvokeArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code>
| firstInvokeArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code>
| firstInvokeArg secondTemplateArg
|}
There are three options you can set to change this behaviour: <code>frameOnly</code>, <code>parentOnly</code> and <code>parentFirst</code>. If you set <code>frameOnly</code> then only arguments passed from the current frame will be accepted; if you set <code>parentOnly</code> then only arguments passed from the parent frame will be accepted; and if you set <code>parentFirst</code> then arguments will be passed from both the current and parent frames, but the parent frame will have priority over the current frame. Here are the results in terms of <code>Template:ExampleArgs</code>:
; frameOnly
{| class="wikitable" style="width: 50em; max-width: 100%;"
|-
! style="width: 60%;" | Code
! style="width: 40%;" | Result
|-
| <code><nowiki>{{ExampleArgs}}</nowiki></code>
| firstInvokeArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code>
| firstInvokeArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code>
| firstInvokeArg
|}
; parentOnly
{| class="wikitable" style="width: 50em; max-width: 100%;"
|-
! style="width: 60%;" | Code
! style="width: 40%;" | Result
|-
| <code><nowiki>{{ExampleArgs}}</nowiki></code>
|
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code>
| firstTemplateArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code>
| firstTemplateArg secondTemplateArg
|}
; parentFirst
{| class="wikitable" style="width: 50em; max-width: 100%;"
|-
! style="width: 60%;" | Code
! style="width: 40%;" | Result
|-
| <code><nowiki>{{ExampleArgs}}</nowiki></code>
| firstInvokeArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code>
| firstTemplateArg
|-
| <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code>
| firstTemplateArg secondTemplateArg
|}
Notes:
# If you set both the <code>frameOnly</code> and <code>parentOnly</code> options, the module won't fetch any arguments at all from #invoke. This is probably not what you want.
# In some situations a parent frame may not be available, e.g. if getArgs is passed the parent frame rather than the current frame. In this case, only the frame arguments will be used (unless parentOnly is set, in which case no arguments will be used) and the <code>parentFirst</code> and <code>frameOnly</code> options will have no effect.
=== Wrappers ===
The ''wrappers'' option is used to specify a limited number of templates as ''wrapper templates'', that is, templates whose only purpose is to call a module. If the module detects that it is being called from a wrapper template, it will only check for arguments in the parent frame; otherwise it will only check for arguments in the frame passed to getArgs. This allows modules to be called by either #invoke or through a wrapper template without the loss of performance associated with having to check both the frame and the parent frame for each argument lookup.
For example, the only content of [[Template:Side box]] (excluding content in {{tag|noinclude}} tags) is <code><nowiki>{{#invoke:Side box|main}}</nowiki></code>. There is no point in checking the arguments passed directly to the #invoke statement for this template, as no arguments will ever be specified there. We can avoid checking arguments passed to #invoke by using the ''parentOnly'' option, but if we do this then #invoke will not work from other pages either. If this were the case, the {{para|text|Some text}} in the code <code><nowiki>{{#invoke:Side box|main|text=Some text}}</nowiki></code> would be ignored completely, no matter what page it was used from. By using the <code>wrappers</code> option to specify 'Template:Side box' as a wrapper, we can make <code><nowiki>{{#invoke:Side box|main|text=Some text}}</nowiki></code> work from most pages, while still not requiring that the module check for arguments on the [[Template:Side box]] page itself.
Wrappers can be specified either as a string, or as an array of strings.
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
wrappers = 'Template:Wrapper template'
})
</syntaxhighlight>
<syntaxhighlight lang="lua">
local args = getArgs(frame, {
wrappers = {
'Template:Wrapper 1',
'Template:Wrapper 2',
-- Any number of wrapper templates can be added here.
}
})
</syntaxhighlight>
Notes:
# The module will automatically detect if it is being called from a wrapper template's /sandbox subpage, so there is no need to specify sandbox pages explicitly.
# The ''wrappers'' option effectively changes the default of the ''frameOnly'' and ''parentOnly'' options. If, for example, ''parentOnly'' were explicitly set to 0 with ''wrappers'' set, calls via wrapper templates would result in both frame and parent arguments being loaded, though calls not via wrapper templates would result in only frame arguments being loaded.
# If the ''wrappers'' option is set and no parent frame is available, the module will always get the arguments from the frame passed to <code>getArgs</code>.
=== Writing to the args table ===
Sometimes it can be useful to write new values to the args table. This is possible with the default settings of this module. (However, bear in mind that it is usually better coding style to create a new table with your new values and copy arguments from the args table as needed.)
<syntaxhighlight lang="lua">
args.foo = 'some value'
</syntaxhighlight>
It is possible to alter this behaviour with the <code>readOnly</code> and <code>noOverwrite</code> options. If <code>readOnly</code> is set then it is not possible to write any values to the args table at all. If <code>noOverwrite</code> is set, then it is possible to add new values to the table, but it is not possible to add a value if it would overwrite any arguments that are passed from #invoke.
=== Ref tags ===
This module uses [[mw:Extension:Scribunto/Lua reference manual#Metatables|metatables]] to fetch arguments from #invoke. This allows access to both the frame arguments and the parent frame arguments without using the <code>pairs()</code> function. This can help if your module might be passed {{tag|ref}} tags as input.
As soon as {{tag|ref}} tags are accessed from Lua, they are processed by the MediaWiki software and the reference will appear in the reference list at the bottom of the article. If your module proceeds to omit the reference tag from the output, you will end up with a phantom reference – a reference that appears in the reference list but without any number linking to it. This has been a problem with modules that use <code>pairs()</code> to detect whether to use the arguments from the frame or the parent frame, as those modules automatically process every available argument.
This module solves this problem by allowing access to both frame and parent frame arguments, while still only fetching those arguments when it is necessary. The problem will still occur if you use <code>pairs(args)</code> elsewhere in your module, however.
=== Known limitations ===
The use of metatables also has its downsides. Most of the normal Lua table tools won't work properly on the args table, including the <code>#</code> operator, the <code>next()</code> function, and the functions in the table library. If using these is important for your module, you should use your own argument processing function instead of this module.<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
[[Category:Lua metamodules]]
}}</includeonly>
== See also ==
* [[Module:Params]]
<includeonly>{{Sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Wikipedia utility modules]]
}}</includeonly>
894bccd0999d42968144b8976af00501e2ed9ad3
Module:Message box
828
18
34
2023-10-07T14:22:16Z
Silentg
2
Created page with "require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions ---------------------------------------------------------------------------..."
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
f2fb84f7b817d2d88747f57c40902a0d8be8158a
Module:Message box/doc
828
19
35
2023-10-07T14:22:49Z
Silentg
2
Created page with "{{Used in system}} {{module rating|p}} {{Lua|Module:Message box/configuration|Module:Yesno|Module:Arguments|Module:Category handler}} {{Uses TemplateStyles|Module:Message box/ambox.css|Module:Message box/cmbox.css|Module:Message box/fmbox.css|Module:Message box/imbox.css|Module:Message box/ombox.css|Module:Message box/tmbox.css}} This is a meta-module that implements the message box templates {{tl|mbox}}, {{tl|ambox}}, {{tl|cmbox}}, {{tl|fmbox}}, {{tl|imbox}}, {{tl|ombo..."
wikitext
text/x-wiki
{{Used in system}}
{{module rating|p}}
{{Lua|Module:Message box/configuration|Module:Yesno|Module:Arguments|Module:Category handler}}
{{Uses TemplateStyles|Module:Message box/ambox.css|Module:Message box/cmbox.css|Module:Message box/fmbox.css|Module:Message box/imbox.css|Module:Message box/ombox.css|Module:Message box/tmbox.css}}
This is a meta-module that implements the message box templates {{tl|mbox}}, {{tl|ambox}}, {{tl|cmbox}}, {{tl|fmbox}}, {{tl|imbox}}, {{tl|ombox}}, and {{tl|tmbox}}. It is intended to be used from Lua modules, and should not be used directly from wiki pages. If you want to use this module's functionality from a wiki page, please use the individual message box templates instead.
== Usage ==
To use this module from another Lua module, first you need to load it.
<syntaxhighlight lang="lua">
local messageBox = require('Module:Message box')
</syntaxhighlight>
To create a message box, use the <code>main</code> function. It takes two parameters: the first is the box type (as a string), and the second is a table containing the message box parameters.
<syntaxhighlight lang="lua">
local box = messageBox.main( boxType, {
param1 = param1,
param2 = param2,
-- More parameters...
})
</syntaxhighlight>
There are seven available box types:
{| class="wikitable"
! Box type !! Template !! Purpose
|-
| <code>mbox</code> || {{tl|mbox}} || For message boxes to be used in multiple namespaces
|-
| <code>ambox</code> || {{tl|ambox}} || For article message boxes
|-
| <code>cmbox</code> || {{tl|cmbox}} || For category message boxes
|-
| <code>fmbox</code> || {{tl|fmbox}} || For interface message boxes
|-
| <code>imbox</code> || {{tl|imbox}} || For file namespace message boxes
|-
| <code>tmbox</code> || {{tl|tmbox}} || For talk page message boxes
|-
| <code>ombox</code> || {{tl|ombox}} || For message boxes in other namespaces
|}
See the template page of each box type for the available parameters.
== Usage from #invoke ==
As well as the <code>main</code> function, this module has separate functions for each box type. They are accessed using the code <code><nowiki>{{#invoke:Message box|mbox|...}}</nowiki></code>, <code><nowiki>{{#invoke:Message box|ambox|...}}</nowiki></code>, etc. These will work when called from other modules, but they access code used to process arguments passed from #invoke, and so calling them will be less efficient than calling <code>main</code>.
== Technical details ==
The module uses the same basic code for each of the templates listed above; the differences between each of them are configured using the data at [[Module:Message box/configuration]]. Here are the various configuration options and what they mean:
* <code>types</code> – a table containing data used by the type parameter of the message box. The table keys are the values that can be passed to the type parameter, and the table values are tables containing the class and the image used by that type.
* <code>default</code> – the type to use if no value was passed to the type parameter, or if an invalid value was specified.
* <code>showInvalidTypeError</code> – whether to show an error if the value passed to the type parameter was invalid.
* <code>allowBlankParams</code> – usually blank values are stripped from parameters passed to the module. However, whitespace is preserved for the parameters included in the allowBlankParams table.
* <code>allowSmall</code> – whether a small version of the message box can be produced with "small=yes".
* <code>smallParam</code> – a custom name for the small parameter. For example, if set to "left" you can produce a small message box using "small=left".
* <code>smallClass</code> – the class to use for small message boxes.
* <code>substCheck</code> – whether to perform a subst check or not.
* <code>classes</code> – an array of classes to use with the message box.
* <code>imageEmptyCell</code> – whether to use an empty {{tag|td}} cell if there is no image set. This is used to preserve spacing for message boxes with a width of less than 100% of the screen.
* <code>imageEmptyCellStyle</code> – whether empty image cells should be styled.
* <code>imageCheckBlank</code> – whether "image=blank" results in no image being displayed.
* <code>imageSmallSize</code> – usually, images used in small message boxes are set to 30x30px. This sets a custom size.
* <code>imageCellDiv</code> – whether to enclose the image in a div enforcing a maximum image size.
* <code>useCollapsibleTextFields</code> – whether to use text fields that can be collapsed, i.e. "issue", "fix", "talk", etc. Currently only used in ambox.
* <code>imageRightNone</code> – whether imageright=none results in no image being displayed on the right-hand side of the message box.
* <code>sectionDefault</code> – the default name for the "section" parameter. Depends on <code>useCollapsibleTextFields</code>.
* <code>allowMainspaceCategories</code> – allow categorisation in the main namespace.
* <code>templateCategory</code> – the name of a category to be placed on the template page.
* <code>templateCategoryRequireName</code> – whether the <code>name</code> parameter is required to display the template category.
* <code>templateErrorCategory</code> – the name of the error category to be used on the template page.
* <code>templateErrorParamsToCheck</code> – an array of parameter names to check. If any are absent, the <code>templateErrorCategory</code> is applied to the template page.
fd6bb8dc654a1b8bb0a0f771130e9b2b5a5c05ad
Module:Message box/configuration
828
20
36
2023-10-07T14:24:57Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-spee..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
27f00af5cf3939613e9156acd5e62a3469d03d81
Module:Message box/configuration/doc
828
21
37
2023-10-07T14:25:41Z
Silentg
2
Created page with "{{Used in system}} {{Module rating|protected}} Configuration for [[Module:Message box]]."
wikitext
text/x-wiki
{{Used in system}}
{{Module rating|protected}}
Configuration for [[Module:Message box]].
ffb793a2e927e8589f3a9b2cc287b2d4584e7afb
Module:Yesno
828
22
38
2023-10-07T14:27:09Z
Silentg
2
Created page with "-- copied from Wikipedia -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes'..."
Scribunto
text/plain
-- copied from Wikipedia
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
995ccb729f43738066a34916a2ca9ad51267d3c8
Module:Yesno/doc
828
23
39
2023-10-07T14:27:38Z
Silentg
2
Created page with "{{used in system}} {{Module rating|protected}} This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "yes", "no", etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns <code>nil</code> values as <code>nil</code>,..."
wikitext
text/x-wiki
{{used in system}}
{{Module rating|protected}}
This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "yes", "no", etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns <code>nil</code> values as <code>nil</code>, to allow for distinctions between <code>nil</code> and <code>false</code>. The module also accepts other Lua structures as input, i.e. booleans, numbers, tables, and functions. If it is passed input that it does not recognise as boolean or <code>nil</code>, it is possible to specify a default value to return.
== Syntax ==
<syntaxhighlight lang="lua">yesno(value, default)</syntaxhighlight>
<code>value</code> is the value to be tested. Boolean input or boolean-style input (see below) always evaluates to either <code>true</code> or <code>false</code>, and <code>nil</code> always evaluates to <code>nil</code>. Other values evaluate to <code>default</code>.
== Usage ==
First, load the module. Note that it can only be loaded from other Lua modules, not from normal wiki pages. For normal wiki pages you can use {{tl|yesno}} instead.
<syntaxhighlight lang="lua">
local yesno = require('Module:Yesno')
</syntaxhighlight>
Some input values always return <code>true</code>, and some always return <code>false</code>. <code>nil</code> values always return <code>nil</code>.
<syntaxhighlight lang="lua">
-- These always return true:
yesno('yes')
yesno('y')
yesno('true')
yesno('t')
yesno('on')
yesno('1')
yesno(1)
yesno(true)
-- These always return false:
yesno('no')
yesno('n')
yesno('false')
yesno('f')
yesno('off')
yesno('0')
yesno(0)
yesno(false)
-- A nil value always returns nil:
yesno(nil)
yesno()
</syntaxhighlight>
String values are converted to lower case before they are matched:
<syntaxhighlight lang="lua">
-- These always return true:
yesno('Yes')
yesno('YES')
yesno('yEs')
yesno('Y')
yesno('tRuE')
-- These always return false:
yesno('No')
yesno('NO')
yesno('nO')
yesno('N')
yesno('fALsE')
</syntaxhighlight>
===Undefined input ('foo')===
You can specify a default value if yesno receives input other than that listed above. If you don't supply a default, the module will return <code>nil</code> for these inputs.
<syntaxhighlight lang="lua">
-- These return nil:
yesno(nil)
yesno('foo')
yesno({})
yesno(5)
yesno('')
yesno(function() return 'This is a function.' end)
yesno(nil, true)
yesno(nil, 'bar')
-- These return true:
yesno('foo', true)
yesno({}, true)
yesno(5, true)
yesno('', true)
yesno(function() return 'This is a function.' end, true)
-- These return "bar":
yesno('foo', 'bar')
yesno({}, 'bar')
yesno(5, 'bar')
yesno('', 'bar')
yesno(function() return 'This is a function.' end, 'bar')
</syntaxhighlight>
Although the empty string usually evaluates to false in wikitext, it evaluates to true in Lua. This module prefers the Lua behaviour over the wikitext behaviour. If treating the empty string as false is important for your module, you will need to convert empty strings to a value that evaluates to false before passing them to this module. In the case of arguments received from wikitext, this can be done by using [[Module:Arguments]].
===Handling nil results===
By definition
:<syntaxhighlight lang="lua">
yesno(nil) -- Returns nil.
yesno('foo') -- Returns nil.
yesno(nil, true) -- Returns nil.
yesno(nil, false) -- Returns nil.
yesno('foo', true) -- Returns true.
</syntaxhighlight>
To get the binary <syntaxhighlight lang="lua" inline>true/false</syntaxhighlight>-only values, use code like:
<syntaxhighlight lang="lua">
myvariable = yesno(value or false) -- When value is nil, result is false.
myvariable = yesno(value or true) -- When value is nil, result is true.
myvariable = yesno('foo') or false -- Unknown string returns nil, result is false.
myvariable = yesno('foo', true) or false -- Default value (here: true) applies, result is true.
</syntaxhighlight><!--
--><includeonly>{{sandbox other||
[[Category:Lua metamodules]]
}}</includeonly>
acae88c54e953bbad689f511129b3d5bbf0364f3
Module:Category handler
828
24
40
2023-10-07T14:29:50Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace alia..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p
b74dd63857b24904ac452429b11213f18647471f
Module:Category handler/doc
828
25
41
2023-10-07T14:30:13Z
Silentg
2
Created page with "{{Used in system}} {{Module rating|p}} {{Lua|Module:Category handler/data|Module:Category handler/shared|Module:Category handler/blacklist|Module:Yesno|Module:Arguments}} This module implements the {{tl|category handler}} template. The category handler template helps other templates to automate both categorization and [[Wikipedia:Category suppression|category suppression]]. For information about using the category handler template in other templates, please see the '''[..."
wikitext
text/x-wiki
{{Used in system}}
{{Module rating|p}}
{{Lua|Module:Category handler/data|Module:Category handler/shared|Module:Category handler/blacklist|Module:Yesno|Module:Arguments}}
This module implements the {{tl|category handler}} template. The category handler template helps other templates to automate both categorization and [[Wikipedia:Category suppression|category suppression]]. For information about using the category handler template in other templates, please see the '''[[Template:Category handler|template documentation]]'''. Keep reading for information about using the category handler module in other Lua modules, or for information on exporting this module to other wikis.
== Use from other Lua modules ==
=== When not to use this module ===
For cases where a module only needs to categorise in one of the namespaces main (articles), file (images) or category, then using this module is overkill. Instead, you can simply get a title object using [[mw:Extension:Scribunto/Lua reference manual#mw.title.getCurrentTitle|mw.title.getCurrentTitle]] and check the <code>nsText</code> field. For example:
<syntaxhighlight lang="lua">
local title = mw.title.getCurrentTitle()
if title.nsText == 'File' then
-- do something
end
</syntaxhighlight>
However, if your module needs to categorize in any other namespace, then we recommend you use this module, since it provides proper category suppression and makes it easy to select how to categorize in the different namespaces.
=== Namespaces ===
This module detects and groups all the different [[Wikipedia:Namespace|namespaces]] used on Wikipedia into several types. These types are used as parameter names in this module.
:'''main''' = Main/article space, as in normal Wikipedia articles.
:'''talk''' = Any talk space, such as page names that start with "Talk:", "User talk:", "File talk:" and so on.
:'''user, wikipedia, file ... = The other namespaces except the talk pages. Namespace aliases are also accepted. See the table below for the full list.'''
:'''other''' = Any namespaces that were not specified as a parameter to the template. See examples below.
;List of possible namespace parameters
(excluding <code>''talk''</code> and <code>''other''</code>)
{{#invoke:Namespace detect|table}}
=== Basic usage ===
This module takes two or more parameters. Here's an example using a hello world program:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'Hello world!'
local category = categoryHandler{
'[[Category:Somecat]]',
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
The above example uses the default settings for the category handler module. That means the example module will categorize on pages in the following namespaces:
:'''main''', '''file''', '''help''', '''category''', '''portal''' and '''book'''
But it will ''not'' categorize in any other namespaces, e.g.:
:'''talk''', '''user''', '''wikipedia''', '''mediawiki''', '''template''' ...
And it will ''not'' categorize on blacklisted pages. (See section [[#Blacklist|blacklist]] below.)
The reason the category handler module does not categorize in some of the namespaces is that in those namespaces most modules and templates are just demonstrated or listed, not used. Thus most modules and templates should not categorize in those namespaces.
Any module or template that is meant for one or more of the namespaces where this module categorizes can use the basic syntax as shown above.
=== Advanced usage ===
This module takes one or more parameters named after the different page types as listed in section [[#Namespaces|namespaces]] above. By using those parameters you can specify exactly in which namespaces your template should categorize. Like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module meant for articles and talk pages.'
local category = categoryHandler{
main = '[[Category:Somecat1]]', -- Categorize in main (article) space
talk = '[[Category:Somecat2]]', -- Categorize in talk space
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
The above module will only categorize in main and talk space. But it will not categorize on /archive pages since they are blacklisted. (See section [[#Blacklist|blacklist]] below.) And if you need to demonstrate (discuss) the module on a talkpage, then you can feed "<code>nocat='true'</code>" to prevent that template from categorizing. (See section [[#Nocat|nocat]] below.) Like this:
<pre>
== My new module ==
Hey guys, have you seen my new module?
{{#invoke:mymodule|main|nocat=true}}
Nice, isn't it?
--~~~~
</pre>
Sometimes we want to use the same category in several namespaces, then do like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module used in several namespaces.'
local category = categoryHandler{
main = '[[Category:Somecat1]]',
[ 1 ] = '[[Category:Somecat2]]', -- For help and user space
help = 1,
user = 1,
talk = '', -- No categories on talk pages
other = '[[Category:Somecat3]]', -- For all other namespaces
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
In the above example we use a numbered parameter to feed one of the categories, and then we tell this module to use that numbered parameter for both the help and user space.
The category handler module understands an unlimited number of numbered parameters.
The '''other''' parameter defines what should be used in the remaining namespaces that have not explicitly been fed data.
Note the empty but defined '''talk''' parameter. That stops this module from showing what has been fed to the '''other''' parameter, when in talk space.
The category handler module also has a parameter called '''all'''. It works like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module used in all namespaces.'
local category = categoryHandler{
all = '[[Category:Somecat1]]', -- Categorize in all namespaces
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
The above example will categorize in all namespaces, but not on blacklisted pages. If you want to demonstrate that module on a page, then use "<code>nocat=true</code>" to prevent the template from categorizing.
We suggest avoiding the '''all''' parameter, since modules and templates should preferably only categorize in the namespaces they need to.
The all parameter can also be combined with the rest of the parameters. Like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module used in all namespaces.'
local category = categoryHandler{
all = '[[Category:Somecat1]]', -- Categorize in all namespaces
main = '[[Category:Somecat2]]', -- And add this in main space
other = '[[Category:Somecat3]]', -- And add this in all other namespaces
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
If the above module is placed on an article, then it will add the categories "Somecat1" and "Somecat2". But on all other types of pages it will instead add "Somecat1" and "Somecat3". As the example shows, the all parameter works independently of the rest of the parameters.
=== Subpages ===
The category handler module understands the '''subpage''' parameter. Like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module used in all namespaces.'
local category = categoryHandler{
subpage = 'no' -- Don't categorize on subpages
wikipedia = '[[Category:Somecat]]',
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
If "<code>subpage='no'</code>" then this template will ''not'' categorize on subpages. For the rare occasion you ''only'' want to categorize on subpages, then use "<code>subpage='only'</code>". If '''subpage''' is empty or undefined then this template categorizes both on basepages and on subpages.
=== Blacklist ===
This module has a blacklist of the pages and page types where templates should not auto-categorize. Thus modules that use this meta-template will for instance not categorize on /archive pages and on the subpages of [[Wikipedia:Template messages]].
If you want a template to categorize on a blacklisted page, then feed "<code><nowiki>nocat = false</nowiki></code>" to the module when you place it on the page, thus skipping the blacklist check. Note that this module only categorizes if it has data for the namespace. For instance, if the basic syntax is used (see [[#Basic usage|basic usage]] above), then even if you set "<code>nocat = false</code>" the template will not categorize on a talk page, since it has no data for talk pages. But it has data for help space, so on a blacklisted help page it will categorize.
The blacklist is located in the configuration table <code>cfg.blacklist</code> near the top of the module code.
=== The "nocat" parameter ===
This module understands the '''nocat''' parameter:
* If "<code>nocat = true</code>" then this template does ''not'' categorize.
* If '''nocat''' is <code>nil</code> then this template categorizes as usual.
* If "<code>nocat = false</code>" this template categorizes even when on blacklisted pages. (See section [[#Blacklist|blacklist]] above.)
* The nocat parameter also accepts aliases for <code>true</code> and <code>false</code> as defined by [[Module:Yesno]], e.g. "yes", "y", "true", and 1 for <code>true</code>, and "no", "n", "false", and 0 for <code>false</code>.
Modules and templates that use {{tlf|category handler}} should forward '''nocat''', so they too understand '''nocat'''. The code "<code>nocat = frame.args.nocat</code>" shown in the examples on this page does that.
=== The "categories" parameter ===
For backwards compatibility this module also understands the '''categories''' parameter. It works the same as '''nocat'''. Like this:
* If "<code>categories = false</code>" then this template does ''not'' categorize.
* If '''categories''' is empty or undefined then this template categorizes as usual.
* If "<code>categories = true</code>" this template categorizes even when on blacklisted pages.
* The categories parameter also accepts aliases for <code>true</code> and <code>false</code> as defined by [[Module:Yesno]], e.g. "yes", "y", "true", and 1 for <code>true</code>, and "no", "n", "false", and 0 for <code>false</code>.
=== The "category2" parameter ===
For backwards compatibility this template kind of supports the old "category =" parameter. But the parameter name "category" is already used in this module to feed category data for when in category space. So instead this template uses '''category2''' for the usage similar to '''nocat'''. Like this:
* If "<code>category2 = "</code>" (empty but defined), or "<code>category2 = 'no'</code>", or if '''category2''' is fed any other data (except as described in the next two points), then this template does ''not'' categorize.
* If '''category2''' is undefined or if "<code>category2 = '¬'</code>", then this template categorizes as usual.
* If "<code>category2 = 'yes'</code>" this template categorizes even when on blacklisted pages.
=== Categories and text ===
Besides from categories, you can feed anything else to this module, for instance some text. Like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local result = 'This is a module used on talk pages.'
local category = categoryHandler{
talk = '[[Category:Somecat]]',
other = '<p class="error">This module should only be used on talk pages.</p>',
nocat = frame.args.nocat -- So "nocat=true/false" works
}
category = category or '' -- Check that we don't have a nil value for the category variable.
return result .. category
end
return p
</syntaxhighlight>
When the module code above is used on anything other than a talk page, it will look like this:
:This is a module used on talk pages.{{#invoke:category handler|main
| talk = [[Category:Somecat]]
| other = <p class="error">This module should only be used on talk pages.</p>
| nocat = {{{nocat|}}} <!--So "nocat=true/false" works-->
}}
That text will not show on blacklisted pages, so don't use this method to show any important information. Feeding "<code>nocat = 'true'</code>" to the template hides the text, just as it suppresses any categories.
=== The "page" parameter ===
For testing and demonstration purposes this module can take a parameter named '''page'''. Like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local category = categoryHandler{
main = 'Category:Some cat',
talk = 'Category:Talk cat',
nocat = frame.args.nocat, -- So "nocat=true/false" works
page = 'User talk:Example'
}
return category
end
return p
</syntaxhighlight>
In the above code we on purpose left out the brackets around the category names so we see the output on the page. No matter on what kind of page the code above is used it will return this:
:{{#invoke:category handler|main
| main = Category:Some cat
| talk = Category:Talk cat
| nocat = {{{nocat|}}} <!--So "nocat=true/false" works-->
| page = User talk:Example
}}
The '''page''' parameter makes this module behave exactly as if on that page. Even the blacklist works. The pagename doesn't have to be an existing page.
If the '''page''' parameter is empty or undefined, the name of the current page determines the result.
You can make it so your module also understands the '''page''' parameter. That means you can test how your template will categorize on different pages, without having to actually edit those pages. Then do like this:
<syntaxhighlight lang="lua">
p = {}
local categoryHandler = require( 'Module:Category handler' ).main
function p.main( frame )
local category = categoryHandler{
main = 'Category:Some cat',
talk = 'Category:Talk cat',
nocat = frame.args.nocat, -- So "nocat=true/false" works
page = frame.args.page -- For testing
}
return category
end
return p
</syntaxhighlight>
=== Parameters ===
List of all parameters:
* First positional parameter - for default settings
* subpage = 'no' / 'only'
* 1, 2, 3 ...
* all = '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text'
* main = 1, 2, 3 ... / '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text'
* ...
* other = 1, 2, 3 ... / '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text'
* nocat = frame.args.nocat / true / false / 'yes' / 'no' / 'y' / 'n' / 'true' / 'false' / 1 / 0
* categories = frame.args.categories / false / true / 'no' / 'yes' / 'n' / 'y' / 'false' / 'true' / 0 / 1
* category2 = frame.args.category or '¬' / 'no' / 'not defined' / '¬' / 'yes'
* page = frame.args.page / 'User:Example'
Note that empty values to the "main" ... "other" parameters have special meaning (see examples above). The "all" parameter doesn't understand numbered parameters, since there should never be a need for that.
== Exporting to other wikis ==
This module can be exported to other wikis by changing the configuration values in the <code>cfg</code> table. All the variable values are configurable, so after the configuration values have been set there should be no need to alter the main module code. Details of each configuration value are included in the module code comments. In addition, this module requires [[Module:Namespace detect]] to be available on the local wiki.
== See also ==
* {{tl|Category handler}} – for using this module with templates, rather than Lua modules.
* [[Wikipedia:Category suppression]] – The how-to guide.
* [[Wikipedia:WikiProject Category Suppression]] – The WikiProject.
* [[Wikipedia:Namespace]] – Lists all the namespaces.
603e893f1993e7e6fa21bb562e50d87d4daccf94
Module:Namespace detect
828
26
42
2023-10-07T15:45:02Z
Silentg
2
Created page with "--[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are..."
Scribunto
text/plain
--[[
--------------------------------------------------------------------------------
-- --
-- NAMESPACE DETECT --
-- --
-- This module implements the {{namespace detect}} template in Lua, with a --
-- few improvements: all namespaces and all namespace aliases are supported, --
-- and namespace names are detected automatically for the local wiki. The --
-- module can also use the corresponding subject namespace value if it is --
-- used on a talk page. Parameter names can be configured for different wikis --
-- by altering the values in the "cfg" table in --
-- Module:Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
--]]
local data = mw.loadData('Module:Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Module:Yesno')
local mArguments -- Lazily initialise Module:Arguments
local mTableTools -- Lazily initilalise Module:TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Fetches a value from the table t1 for the first key in array t2 where
-- a non-nil value of t1 exists.
for i, key in ipairs(t2) do
local value = t1[key]
if value ~= nil then
return value
end
end
return nil
end
local function equalsArrayValue(t, value)
-- Returns true if value equals a value in the array t. Otherwise
-- returns false.
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Get the page object, passing the function through pcall in case of
-- errors, e.g. being over the expensive function count limit.
if page then
local success, pageObject = pcall(mw.title.new, page)
if success then
return pageObject
else
return nil
end
else
return mw.title.getCurrentTitle()
end
end
-- Provided for backward compatibility with other modules
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- This function gets the namespace name from the page object.
local page = fetchValue(args, argKeys.demopage)
if page == '' then
page = nil
end
local demospace = fetchValue(args, argKeys.demospace)
if demospace == '' then
demospace = nil
end
local subjectns = fetchValue(args, argKeys.subjectns)
local ret
if demospace then
-- Handle "demospace = main" properly.
if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
ret = mw.site.namespaces[0].name
else
ret = demospace
end
else
local pageObject = p.getPageObject(page)
if pageObject then
if pageObject.isTalkPage then
-- Get the subject namespace if the option is set,
-- otherwise use "talk".
if yesno(subjectns) then
ret = mw.site.namespaces[pageObject.namespace].subject.name
else
ret = 'talk'
end
else
ret = pageObject.nsText
end
else
return nil -- return nil if the page object doesn't exist.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Check the parameters stored in the mappings table for any matches.
local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
--[[
-- If there were no matches, return parameters for other namespaces.
-- This happens if there was no text specified for the namespace that
-- was detected or if the demospace parameter is not a valid
-- namespace. Note that the parameter for the detected namespace must be
-- completely absent for this to happen, not merely blank.
--]]
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
--[[
-- Create a wikitable of all subject namespace parameters, for
-- documentation purposes. The talk parameter is optional, in case it
-- needs to be excluded in the documentation.
--]]
-- Load modules and initialise variables.
mTableTools = require('Module:TableTools')
local namespaces = mw.site.namespaces
local cfg = data.cfg
local useTalk = type(frame) == 'table'
and type(frame.args) == 'table'
and yesno(frame.args.talk) -- Whether to use the talk parameter.
-- Get the header names.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases')
-- Put the namespaces in order.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Build the table.
local ret = '{| class="wikitable"'
.. '\n|-'
.. '\n! ' .. nsHeader
.. '\n! ' .. aliasesHeader
for i, params in ipairs(mappingsOrdered) do
for j, param in ipairs(params) do
if j == 1 then
ret = ret .. '\n|-'
.. '\n| <code>' .. param .. '</code>'
.. '\n| '
elseif j == 2 then
ret = ret .. '<code>' .. param .. '</code>'
else
ret = ret .. ', <code>' .. param .. '</code>'
end
end
end
ret = ret .. '\n|-'
.. '\n|}'
return ret
end
return p
a4757000273064f151f0f22dc0e139092e5ff443
Module:Namespace detect/doc
828
27
43
2023-10-07T15:46:23Z
Silentg
2
Created page with "{{Used in system}} {{Module rating|protected}} {{Lua|Module:Namespace detect/data|Module:Yesno|Module:Arguments|Module:TableTools}} This module allows you to output different text depending on the [[WP:NAMESPACE|namespace]] that a given page is in. It is a [[WP:Lua|Lua]] implementation of the {{tl|namespace detect}} template, with a few improvements: all namespaces and all namespace aliases are supported, and namespace names are detected automatically for the local wiki..."
wikitext
text/x-wiki
{{Used in system}}
{{Module rating|protected}}
{{Lua|Module:Namespace detect/data|Module:Yesno|Module:Arguments|Module:TableTools}}
This module allows you to output different text depending on the [[WP:NAMESPACE|namespace]] that a given page is in. It is a [[WP:Lua|Lua]] implementation of the {{tl|namespace detect}} template, with a few improvements: all namespaces and all namespace aliases are supported, and namespace names are detected automatically for the local wiki.
== Usage ==
<pre>
{{#invoke: Namespace detect | main
| page = <!-- page to detect namespace for, if not the current page -->
| main = <!-- text to return for the main namespace -->
| talk = <!-- text to return for talk namespaces -->
<!-- text to return for specific subject namespaces -->
| portal =
| category =
| user =
| wikipedia =
| mediawiki =
| book =
| timedtext =
| template =
| special =
| media =
| file =
| image =
| help =
| module =
| other = <!-- text to return for unspecified namespaces -->
| demospace = <!-- namespace to display text for -->
| subjectns = <!-- set to "yes" to treat talk pages as the corresponding subject page -->
}}
</pre>
== Parameters ==
* '''main''' - text to return if the page is in the main namespace.
* '''talk''' - text to return if the page is in a talk namespace. This can be any talk namespace - it will match any of "Talk:", "Wikipedia talk:", "User talk:", etc.
* Subject namespace parameters, e.g. '''wikipedia''', '''user''', '''file'''... - the text to return if the page is in the corresponding namespace. This module accepts all subject namespaces as parameters, including [[Wikipedia:Namespace#Aliases|namespace aliases]] and [[Wikipedia:Namespace#Virtual namespaces|virtual namespaces]]. See below for a list of supported values.
* '''other''' - text to return if no parameters for the page's namespace were specified. This text is also returned if {{para|demospace}} is set to an invalid namespace value.
* '''subjectns''' - if on a talk page, use the corresponding subject page. Can be set with values of "yes", "y", "true" or "1".
* '''demopage''' - specifies a page to detect the namespace of. If not specified, and if the {{para|demospace}} parameter is not set, then the module uses the current page.
* '''demospace''' - force the module to behave as if the page was in the specified namespace. Often used for demonstrations.
=== Namespace parameters ===
Possible values for subject namespace parameters are as follows:
{{#invoke:Namespace detect|table}}
== Table function ==
Use the following to display a table with the different possible namespace parameters:
{{#invoke:Namespace detect|table|talk=''yes''}}
To include the parameter for talk namespaces, use {{para|talk|yes}}.
== Porting to different wikis ==
This module is designed to be portable. To use it on a different wiki, all you need to do is to change the values in [[Module:Namespace detect/config]]. Instructions are available on that page.
== Technical details ==
The module uses a data page at [[Module:Namespace detect/data]]. This page is loaded with [[mw:Extension:Scribunto/Lua reference manual#mw.loadData|mw.loadData]], which means it is processed once per page rather than once per #invoke. This was done for performance reasons.
48d83d74692978120e623424c21160f00e65e75b
Module:Namespace detect/data
828
28
44
2023-10-07T15:47:19Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect data --
-- This module holds data for [[Module:Namespace detect]] to be loaded per --
-- page, rather than per #invoke, for performance reasons. --
--------------------------------------------------------------------------------
local cfg = require('Module:Namespace detect/config')
local function addKey(t, key, defaultKey)
if key ~= defaultKey then
t[#t + 1] = key
end
end
-- Get a table of parameters to query for each default parameter name.
-- This allows wikis to customise parameter names in the cfg table while
-- ensuring that default parameter names will always work. The cfg table
-- values can be added as a string, or as an array of strings.
local defaultKeys = {
'main',
'talk',
'other',
'subjectns',
'demospace',
'demopage'
}
local argKeys = {}
for i, defaultKey in ipairs(defaultKeys) do
argKeys[defaultKey] = {defaultKey}
end
for defaultKey, t in pairs(argKeys) do
local cfgValue = cfg[defaultKey]
local cfgValueType = type(cfgValue)
if cfgValueType == 'string' then
addKey(t, cfgValue, defaultKey)
elseif cfgValueType == 'table' then
for i, key in ipairs(cfgValue) do
addKey(t, key, defaultKey)
end
end
cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more.
end
local function getParamMappings()
--[[
-- Returns a table of how parameter names map to namespace names. The keys
-- are the actual namespace names, in lower case, and the values are the
-- possible parameter names for that namespace, also in lower case. The
-- table entries are structured like this:
-- {
-- [''] = {'main'},
-- ['wikipedia'] = {'wikipedia', 'project', 'wp'},
-- ...
-- }
--]]
local mappings = {}
local mainNsName = mw.site.subjectNamespaces[0].name
mainNsName = mw.ustring.lower(mainNsName)
mappings[mainNsName] = mw.clone(argKeys.main)
mappings['talk'] = mw.clone(argKeys.talk)
for nsid, ns in pairs(mw.site.subjectNamespaces) do
if nsid ~= 0 then -- Exclude main namespace.
local nsname = mw.ustring.lower(ns.name)
local canonicalName = mw.ustring.lower(ns.canonicalName)
mappings[nsname] = {nsname}
if canonicalName ~= nsname then
table.insert(mappings[nsname], canonicalName)
end
for _, alias in ipairs(ns.aliases) do
table.insert(mappings[nsname], mw.ustring.lower(alias))
end
end
end
return mappings
end
return {
argKeys = argKeys,
cfg = cfg,
mappings = getParamMappings()
}
d224f42a258bc308ef3ad8cc8686cd7a4f47d005
Module:Namespace detect/data/doc
828
29
45
2023-10-07T15:48:11Z
Silentg
2
Created page with "{{Module rating|protected}} {{used in system}} {{Lua|Module:Namespace detect/config}} This is a data page for [[Module:Namespace detect]] and [[Module:Category handler/shared]]. It is loaded by the main module using mw.loadData, which means it is only processed once per page rather than once per #invoke."
wikitext
text/x-wiki
{{Module rating|protected}}
{{used in system}}
{{Lua|Module:Namespace detect/config}}
This is a data page for [[Module:Namespace detect]] and [[Module:Category handler/shared]]. It is loaded by the main module using mw.loadData, which means it is only processed once per page rather than once per #invoke.
9935d604067362cf867e213811884d1d5011e9b9
Module:Namespace detect/config
828
30
46
2023-10-07T15:49:27Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- --..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Namespace detect configuration data --
-- --
-- This module stores configuration data for Module:Namespace detect. Here --
-- you can localise the module to your wiki's language. --
-- --
-- To activate a configuration item, you need to uncomment it. This means --
-- that you need to remove the text "-- " at the start of the line. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. Values added --
-- here will work in addition to the default English parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- cfg.foo = 'parameter name' --
-- --
-- To add multiple names, you can use this format: --
-- --
-- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} --
--------------------------------------------------------------------------------
---- This parameter displays content for the main namespace:
-- cfg.main = 'main'
---- This parameter displays in talk namespaces:
-- cfg.talk = 'talk'
---- This parameter displays content for "other" namespaces (namespaces for which
---- parameters have not been specified):
-- cfg.other = 'other'
---- This parameter makes talk pages behave as though they are the corresponding
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].
---- Edit that module to change the default values of "yes", "no", etc.
-- cfg.subjectns = 'subjectns'
---- This parameter sets a demonstration namespace:
-- cfg.demospace = 'demospace'
---- This parameter sets a specific page to compare:
cfg.demopage = 'page'
--------------------------------------------------------------------------------
-- Table configuration --
-- These configuration items allow customisation of the "table" function, --
-- used to generate a table of possible parameters in the module --
-- documentation. --
--------------------------------------------------------------------------------
---- The header for the namespace column in the wikitable containing the list of
---- possible subject-space parameters.
-- cfg.wikitableNamespaceHeader = 'Namespace'
---- The header for the wikitable containing the list of possible subject-space
---- parameters.
-- cfg.wikitableAliasesHeader = 'Aliases'
--------------------------------------------------------------------------------
-- End of configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
0e4ff08d13c4b664d66b32c232deb129b77c1a56
Module:Namespace detect/config/doc
828
31
47
2023-10-07T15:49:42Z
Silentg
2
Created page with "{{module rating|protected}} {{used in system}} This module provides configuration data for [[Module:Namespace detect]]. To change the data, please follow the instructions in the module comments."
wikitext
text/x-wiki
{{module rating|protected}}
{{used in system}}
This module provides configuration data for [[Module:Namespace detect]]. To change the data, please follow the instructions in the module comments.
1d1398c82a511e65717d9725230f68a461bee81e
Module:TableTools
828
32
48
2023-10-07T15:50:51Z
Silentg
2
Created page with "------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke...."
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
085e7094ac84eb0132ee65822cf3f69cd8ba3d81
Module:TableTools/doc
828
33
49
2023-10-07T15:51:16Z
Silentg
2
Created page with "{{used in system}} {{module rating|protected}} {{lua|Module:Exponential search|noprotcat=yes}} This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke. == Loading the module == To use any of the functions, first you must load the module. <syntaxhighlight lang="lua"> local TableTools = require('Module:TableTools') </syntaxhighlight> == isPosit..."
wikitext
text/x-wiki
{{used in system}}
{{module rating|protected}}
{{lua|Module:Exponential search|noprotcat=yes}}
This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke.
== Loading the module ==
To use any of the functions, first you must load the module.
<syntaxhighlight lang="lua">
local TableTools = require('Module:TableTools')
</syntaxhighlight>
== isPositiveInteger ==
<syntaxhighlight lang="lua">
TableTools.isPositiveInteger(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a positive integer, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table.
== isNan ==
<syntaxhighlight lang="lua">
TableTools.isNan(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a [[NaN]] value, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.)
== shallowClone ==
<syntaxhighlight lang="lua">
TableTools.shallowClone(t)
</syntaxhighlight>
Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use <code>[[mw:Extension:Scribunto/Lua reference manual#mw.clone|mw.clone]]</code> instead. If you want to make a new table with no shared subtables and without metatables transferred, use <code>[[#deepCopy|deepCopy]]</code> with the <code>noMetatable</code> option.
== removeDuplicates ==
<syntaxhighlight lang="lua">
TableTools.removeDuplicates(t)
</syntaxhighlight>
Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first <code>nil</code> value. (For arrays containing <code>nil</code> values, you can use <code>[[#compressSparseArray|compressSparseArray]]</code> first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {{code|code={5, 4, 4, 3, 4, 2, 2, 1}|lang=lua}} <code>removeDuplicates</code> will return {{code|code={5, 4, 3, 2, 1}|lang=lua}}.
== numKeys ==
<syntaxhighlight lang="lua">
TableTools.numKeys(t)
</syntaxhighlight>
Takes a table <code>''t''</code> and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {{code|code={'foo', nil, 'bar', 'baz', a = 'b'}|lang=lua}}, <code>numKeys</code> will return {{code|code={1, 3, 4}|lang=lua}}.
== affixNums ==
<syntaxhighlight lang="lua">
TableTools.affixNums(t, prefix, suffix)
</syntaxhighlight>
Takes a table <code>''t''</code> and returns an array containing the numbers of keys with the optional prefix <code>''prefix''</code> and the optional suffix <code>''suffix''</code>. For example, for the table {{code|code={a1 = 'foo', a3 = 'bar', a6 = 'baz'}|lang=lua}} and the prefix <code>'a'</code>, <code>affixNums</code> will return {{code|code={1, 3, 6}|lang=lua}}. All characters in <code>''prefix''</code> and <code>''suffix''</code> are interpreted literally.
== numData ==
<syntaxhighlight lang="lua">
TableTools.numData(t, compress)
</syntaxhighlight>
Given a table with keys like <code>"foo1"</code>, <code>"bar1"</code>, <code>"foo2"</code>, and <code>"baz2"</code>, returns a table of subtables in the format {{code|code={ [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }|lang=lua}}. Keys that don't end with an integer are stored in a subtable named <code>"other"</code>. The compress option compresses the table so that it can be iterated over with <code>ipairs</code>.
== compressSparseArray ==
<syntaxhighlight lang="lua">
TableTools.compressSparseArray(t)
</syntaxhighlight>
Takes an array <code>''t''</code> with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with <code>ipairs</code>. Any keys that are not positive integers are removed. For example, for the table {{code|code={1, nil, foo = 'bar', 3, 2}|lang=lua}}, <code>compressSparseArray</code> will return {{code|code={1, 3, 2}|lang=lua}}.
== sparseIpairs ==
<syntaxhighlight lang="lua">
TableTools.sparseIpairs(t)
</syntaxhighlight>
This is an iterator function for traversing a sparse array <code>''t''</code>. It is similar to <code>[[mw:Extension:Scribunto/Lua reference manual#ipairs|ipairs]]</code>, but will continue to iterate until the highest numerical key, whereas <code>ipairs</code> may stop after the first <code>nil</code> value. Any keys that are not positive integers are ignored.
Usually <code>sparseIpairs</code> is used in a generic <code>for</code> loop.
<syntaxhighlight lang="lua">
for i, v in TableTools.sparseIpairs(t) do
-- code block
end
</syntaxhighlight>
Note that <code>sparseIpairs</code> uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function in its implementation. Although some table keys appear to be ignored, all table keys are accessed when it is run.
== size ==
<syntaxhighlight lang="lua">
TableTools.size(t)
</syntaxhighlight>
Finds the size of a key/value pair table. For example, for the table {{code|code={foo = 'foo', bar = 'bar'}|lang=lua}}, <code>size</code> will return <code>2</code>. The function will also work on arrays, but for arrays it is more efficient to use the <code>#</code> operator. Note that to find the table size, this function uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function to iterate through all of the table keys.
== keysToList ==
<syntaxhighlight lang="lua">
TableTools.keysToList(t, keySort, checked)
</syntaxhighlight>
Returns a list of the keys in a table, sorted using either a default comparison function or a custom <code>''keySort''</code> function, which follows the same rules as the <code>comp</code> function supplied to <code>[[mw:Extension:Scribunto/Lua reference manual#table.sort|table.sort]]</code>. If <code>''keySort''</code> is <code>false</code>, no sorting is done. Set <code>''checked''</code> to <code>true</code> to skip the internal type checking.
== sortedPairs ==
<syntaxhighlight lang="lua">
TableTools.sortedPairs(t, keySort)
</syntaxhighlight>
Iterates through a table, with the keys sorted using the <code>keysToList</code> function. If there are only numerical keys, <code>sparseIpairs</code> is probably more efficient.
== isArray ==
<syntaxhighlight lang="lua">
TableTools.isArray(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a table and all keys are consecutive integers starting at 1.
== isArrayLike ==
<syntaxhighlight lang="lua">
TableTools.isArrayLike(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is iterable and all keys are consecutive integers starting at 1.
== invert ==
<syntaxhighlight lang="lua">
TableTools.invert(arr)
</syntaxhighlight>
Transposes the keys and values in an array. For example, {{code|invert{ "a", "b", "c" }|lua}} yields {{code|code={ a=1, b=2, c=3 }|lang=lua}}.
== listToSet ==
<syntaxhighlight lang="lua">
TableTools.listToSet(arr)
</syntaxhighlight>
Creates a set from the array part of the table <code>''arr''</code>. Indexing the set by any of the values of the array returns <code>true</code>. For example, {{code|listToSet{ "a", "b", "c" }|lua}} yields {{code|code={ a=true, b=true, c=true }|lang=lua}}. See also [[Module:Lua set]] for more advanced ways to create a set.
== deepCopy ==
<syntaxhighlight lang="lua">
TableTools.deepCopy(orig, noMetatable, alreadySeen)
</syntaxhighlight>
Creates a copy of the table <code>''orig''</code>. As with <code>mw.clone</code>, all values that are not functions are duplicated and the identity of tables is preserved. If <code>''noMetatable''</code> is <code>true</code>, then the metatable (if any) is not copied. Can copy tables loaded with <code>mw.loadData</code>.
Similar to <code>mw.clone</code>, but <code>mw.clone</code> cannot copy tables loaded with <code>mw.loadData</code> and does not allow metatables <em>not</em> to be copied.
== sparseConcat ==
<syntaxhighlight lang="lua">
TableTools.sparseConcat(t, sep, i, j)
</syntaxhighlight>
Concatenates all values in the table that are indexed by a positive integer, in order. For example, {{code|sparseConcat{ "a", nil, "c", "d" }|lua}} yields {{code|"acd"|lua}} and {{code|sparseConcat{ nil, "b", "c", "d" }|lua}} yields {{code|"bcd"|lua}}.
== length ==
<syntaxhighlight lang="lua">
TableTools.length(t, prefix)
</syntaxhighlight>
Finds the length of an array or of a quasi-array with keys with an optional <code>''prefix''</code> such as "data1", "data2", etc. It uses an [[exponential search]] algorithm to find the length, so as to use as few table lookups as possible.
This algorithm is useful for arrays that use metatables (e.g. [[mw:Extension:Scribunto/Lua reference manual#frame.args|frame.args]]) and for quasi-arrays. For normal arrays, just use the [[mw:Extension:Scribunto/Lua reference manual#Length operator|# operator]], as it is implemented in [[C (programming language)|C]] and will be quicker.
== inArray ==
<syntaxhighlight lang="lua">
TableTools.inArray(arr, valueToFind)
</syntaxhighlight>
Returns <code>true</code> if <code>''valueToFind''</code> is a member of the array <code>''arr''</code>, and <code>false</code> otherwise.
<includeonly>{{Sandbox other||
[[Category:Lua metamodules|TableTools]]
}}</includeonly>
6fcbbdc2d7277a80556bd4c7daaf380903d3d831
Module:Exponential search
828
34
50
2023-10-07T15:52:25Z
Silentg
2
Created page with "-- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, low..."
Scribunto
text/plain
-- This module provides a generic exponential search algorithm.
require[[strict]]
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"invalid init value '%s' detected in argument #2 to " ..
"'Exponential search' (init value must be a positive integer)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
a9037be0c44536be79b2d7a26155bfb907368ae7
Module:Exponential search/doc
828
35
51
2023-10-07T15:52:56Z
Silentg
2
Created page with "This module provides a generic [[exponential search]] algorithm. This kind of search can be useful when you want to find a key in some kind of sorted array, and you want to do it by checking as few array elements as possible. This could include situations like: * Finding the highest archive number in a set of archives without checking whether they all exist. * Finding the number of positional arguments in frame.args without having to expand the wikitext for each of them...."
wikitext
text/x-wiki
This module provides a generic [[exponential search]] algorithm. This kind of search can be useful when you want to find a key in some kind of sorted array, and you want to do it by checking as few array elements as possible. This could include situations like:
* Finding the highest archive number in a set of archives without checking whether they all exist.
* Finding the number of positional arguments in frame.args without having to expand the wikitext for each of them.
You shouldn't use this module if any of the following apply:
# You can use the [[mw:Extension:Scribunto/Lua reference manual#Length operator|Lua length operator]] to find what you need.
# Your array has any gaps in it. (In other words, any of the items before the final item is <code>nil</code>, e.g. <syntaxhighlight lang="lua" inline>{'foo', 'bar', nil, 'baz'}</syntaxhighlight>.) If you try and use this module on a sparse array, you might get an erroneous value.
# Your array has less then about 10 items in it. It's possible to use this module for those arrays, but you will access most of the array elements anyway (perhaps some of them twice), and your code will be more complicated than if you just used a for loop.
== Usage ==
First, load the module.
<syntaxhighlight lang="lua">
local expSearch = require('Module:Exponential search')
</syntaxhighlight>
You can then use the expSearch function with the following syntax:
<syntaxhighlight lang="lua">
expSearch(testFunc, init)
</syntaxhighlight>
Parameters:
* <var>testFunc</var> - a test function for your array. This function should take a positive integer <var>i</var> as its first parameter. If the element corresponding to <var>i</var> is not in the array, then the function should return false or nil; and if it ''is'' in the array, then the function should return a truthy value (anything other than false or nil). (required)
* <var>init</var> - the initial value of <var>i</var> to check. For advanced users. (optional)
expSearch will return the highest value of <var>i</var> for which testFunc was truthy. If no values were truthy, the function will return nil.
== Examples ==
=== Jimbo's talk archives ===
[[User talk:Jimbo Wales]] has archives at [[User talk:Jimbo Wales/Archive 1]], [[User talk:Jimbo Wales/Archive 2]], ... To find the highest archive number, you would use code like this:
<syntaxhighlight lang="lua">
local expSearch = require('Module:Exponential search')
local highestArchive = expSearch(function (i)
local archive = 'User talk:Jimbo Wales/Archive ' .. i
return mw.title.new(archive).exists
end)
</syntaxhighlight>
=== Village pump archives ===
[[Wikipedia:Village pump (proposals)]] has old archives at [[Wikipedia:Village pump (proposals)/Archive A]], [[Wikipedia:Village pump (proposals)/Archive B]], etc. After they go through to Archive Z, the next archive is Archive AA. Although these archives aren't being updated anymore, as a demonstration we can find the highest one using this module; all we need is a function that converts from an integer to the corresponding archive name.
<syntaxhighlight lang="lua">
local expSearch = require('Module:Exponential search')
local function integerToAlpha(i)
-- This function converts 1 to A, 2 to B, ... 26 to Z, 27 to AA, ...
local ret = ''
while i > 0 do
local rem = i % 26
if rem == 0 then
rem = 26
end
local char = string.char(rem + 64) -- the "rem"th letter of the alphabet
ret = char .. ret
i = (i - rem) / 26
end
return ret
end
local function integerToArchive(i)
return 'Wikipedia:Village pump (proposals)/Archive ' .. integerToAlpha(i)
end
local highestInteger = expSearch(function (i)
local archive = integerToArchive(i)
return mw.title.new(archive).exists
end)
local highestArchive = integerToArchive(highestInteger)
</syntaxhighlight>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
38059e276cf6ef2f0c404c0e8f51aac232d6d57d
Module:Category handler/data
828
36
52
2023-10-07T15:54:01Z
Silentg
2
Created page with "-- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(..."
Scribunto
text/plain
-- This module assembles data to be passed to [[Module:Category handler]] using
-- mw.loadData. This includes the configuration data and whether the current
-- page matches the title blacklist.
local data = require('Module:Category handler/config')
local mShared = require('Module:Category handler/shared')
local blacklist = require('Module:Category handler/blacklist')
local title = mw.title.getCurrentTitle()
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(
title.prefixedText,
blacklist
)
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(
title,
mShared.getParamMappings()
)
return data
abbc68048ff698e88dda06b64ecf384bbf583120
Module:Category handler/data/doc
828
37
53
2023-10-07T15:54:45Z
Silentg
2
Created page with "This module is used in conjunction with the category handler module to manage categories; it is a very important template used on millions of pages. {{Module rating|protected}} {{used in system}} {{Lua|Module:Category handler/config|Module:Category handler/shared|Module:Category handler/blacklist}}"
wikitext
text/x-wiki
This module is used in conjunction with the category handler module to manage categories; it is a very important template used on millions of pages.
{{Module rating|protected}}
{{used in system}}
{{Lua|Module:Category handler/config|Module:Category handler/shared|Module:Category handler/blacklist}}
0ac6af0f4ee02181e6f587282cfcfdb878ea5ea9
Module:Category handler/config
828
38
54
2023-10-07T15:55:39Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. ----------------------------..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- [[Module:Category handler]] configuration data --
-- Language-specific parameter names and values can be set here. --
-- For blacklist config, see [[Module:Category handler/blacklist]]. --
--------------------------------------------------------------------------------
local cfg = {} -- Don't edit this line.
--------------------------------------------------------------------------------
-- Start configuration data --
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Parameter names --
-- These configuration items specify custom parameter names. --
-- To add one extra name, you can use this format: --
-- --
-- foo = 'parameter name', --
-- --
-- To add multiple names, you can use this format: --
-- --
-- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, --
--------------------------------------------------------------------------------
cfg.parameters = {
-- The nocat and categories parameter suppress
-- categorisation. They are used with Module:Yesno, and work as follows:
--
-- cfg.nocat:
-- Result of yesno() Effect
-- true Categorisation is suppressed
-- false Categorisation is allowed, and
-- the blacklist check is skipped
-- nil Categorisation is allowed
--
-- cfg.categories:
-- Result of yesno() Effect
-- true Categorisation is allowed, and
-- the blacklist check is skipped
-- false Categorisation is suppressed
-- nil Categorisation is allowed
nocat = 'nocat',
categories = 'categories',
-- The parameter name for the legacy "category2" parameter. This skips the
-- blacklist if set to the cfg.category2Yes value, and suppresses
-- categorisation if present but equal to anything other than
-- cfg.category2Yes or cfg.category2Negative.
category2 = 'category2',
-- cfg.subpage is the parameter name to specify how to behave on subpages.
subpage = 'subpage',
-- The parameter for data to return in all namespaces.
all = 'all',
-- The parameter name for data to return if no data is specified for the
-- namespace that is detected.
other = 'other',
-- The parameter name used to specify a page other than the current page;
-- used for testing and demonstration.
demopage = 'page',
}
--------------------------------------------------------------------------------
-- Parameter values --
-- These are set values that can be used with certain parameters. Only one --
-- value can be specified, like this: --
-- --
-- cfg.foo = 'value name' -- --
--------------------------------------------------------------------------------
-- The following settings are used with the cfg.category2 parameter. Setting
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2
-- is present but equal to anything other than cfg.category2Yes or
-- cfg.category2Negative then it supresses cateogrisation.
cfg.category2Yes = 'yes'
cfg.category2Negative = '¬'
-- The following settings are used with the cfg.subpage parameter.
-- cfg.subpageNo is the value to specify to not categorise on subpages;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.
cfg.subpageNo = 'no'
cfg.subpageOnly = 'only'
--------------------------------------------------------------------------------
-- Default namespaces --
-- This is a table of namespaces to categorise by default. The keys are the --
-- namespace numbers. --
--------------------------------------------------------------------------------
cfg.defaultNamespaces = {
[ 0] = true, -- main
[ 6] = true, -- file
[ 12] = true, -- help
[ 14] = true, -- category
[100] = true, -- portal
[108] = true, -- book
}
--------------------------------------------------------------------------------
-- Wrappers --
-- This is a wrapper template or a list of wrapper templates to be passed to --
-- [[Module:Arguments]]. --
--------------------------------------------------------------------------------
cfg.wrappers = 'Template:Category handler'
--------------------------------------------------------------------------------
-- End configuration data --
--------------------------------------------------------------------------------
return cfg -- Don't edit this line.
373cd107b13a5b00e6a1b7e66a749f12502c849d
Module:Category handler/config/doc
828
39
55
2023-10-07T15:56:35Z
Silentg
2
Created page with "{{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}} <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>"
wikitext
text/x-wiki
{{Module rating |protected}}
{{used in system}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
== Usage ==
<nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
2b32cbbd34cf50b501809c68db187cdf6f9d334c
Module:Category handler/shared
828
40
56
2023-10-07T15:57:12Z
Silentg
2
Created page with "-- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return..."
Scribunto
text/plain
-- This module contains shared functions used by [[Module:Category handler]]
-- and its submodules.
local p = {}
function p.matchesBlacklist(page, blacklist)
for i, pattern in ipairs(blacklist) do
local match = mw.ustring.match(page, pattern)
if match then
return true
end
end
return false
end
function p.getParamMappings(useLoadData)
local dataPage = 'Module:Namespace detect/data'
if useLoadData then
return mw.loadData(dataPage).mappings
else
return require(dataPage).mappings
end
end
function p.getNamespaceParameters(titleObj, mappings)
-- We don't use title.nsText for the namespace name because it adds
-- underscores.
local mappingsKey
if titleObj.isTalkPage then
mappingsKey = 'talk'
else
mappingsKey = mw.site.namespaces[titleObj.namespace].name
end
mappingsKey = mw.ustring.lower(mappingsKey)
return mappings[mappingsKey] or {}
end
return p
d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5
Module:Category handler/shared/doc
828
41
57
2023-10-07T15:58:52Z
Silentg
2
Created page with "{{Module rating |protected}} {{used in system}} {{Lua|Module:Namespace detect/data}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>"
wikitext
text/x-wiki
{{Module rating |protected}}
{{used in system}}
{{Lua|Module:Namespace detect/data}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
== Usage ==
<code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
ad9ad9af78f62b02930d66f650c1930443fb35e0
Module:Category handler/blacklist
828
42
58
2023-10-07T15:59:55Z
Silentg
2
Created page with "-- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbo..."
Scribunto
text/plain
-- This module contains the blacklist used by [[Module:Category handler]].
-- Pages that match Lua patterns in this list will not be categorised unless
-- categorisation is explicitly requested.
return {
'^Main Page$', -- don't categorise the main page.
-- Don't categorise the following pages or their subpages.
-- "%f[/\0]" matches if the next character is "/" or the end of the string.
'^Wikipedia:Cascade%-protected items%f[/\0]',
'^User:UBX%f[/\0]', -- The userbox "template" space.
'^User talk:UBX%f[/\0]',
-- Don't categorise subpages of these pages, but allow
-- categorisation of the base page.
'^Wikipedia:Template index/.*$',
-- Don't categorise archives.
'/[aA]rchive',
"^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$",
}
87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855
Module:Category handler/blacklist/doc
828
43
59
2023-10-07T16:25:28Z
Silentg
2
Created page with "{{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>"
wikitext
text/x-wiki
{{Module rating |protected}}
{{used in system}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
== Usage ==
<code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
6e4367788f67362df755e3c11ad8d64eb40778ff
Module:Message box/ambox.css
828
44
60
2023-10-07T16:31:54Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: rais..."
sanitized-css
text/css
/* {{pp|small=y}} */
.ambox {
border: 1px solid #a2a9b1;
/* @noflip */
border-left: 10px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* Single border between stacked boxes. Take into account base templatestyles,
* user styles, and Template:Dated maintenance category.
* remove link selector when T200206 is fixed
*/
.ambox + link + .ambox,
.ambox + link + style + .ambox,
.ambox + link + link + .ambox,
/* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */
.ambox + .mw-empty-elt + link + .ambox,
.ambox + .mw-empty-elt + link + style + .ambox,
.ambox + .mw-empty-elt + link + link + .ambox {
margin-top: -1px;
}
/* For the "small=left" option. */
/* must override .ambox + .ambox styles above */
html body.mediawiki .ambox.mbox-small-left {
/* @noflip */
margin: 4px 1em 4px 0;
overflow: hidden;
width: 238px;
border-collapse: collapse;
font-size: 88%;
line-height: 1.25em;
}
.ambox-speedy {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ambox-delete {
/* @noflip */
border-left: 10px solid #b32424; /* Red */
}
.ambox-content {
/* @noflip */
border-left: 10px solid #f28500; /* Orange */
}
.ambox-style {
/* @noflip */
border-left: 10px solid #fc3; /* Yellow */
}
.ambox-move {
/* @noflip */
border-left: 10px solid #9932cc; /* Purple */
}
.ambox-protection {
/* @noflip */
border-left: 10px solid #a2a9b1; /* Gray-gold */
}
.ambox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.5em;
width: 100%;
}
.ambox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.5em;
text-align: center;
}
.ambox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.5em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ambox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ambox .mbox-image-div {
width: 52px;
}
/* Hack around MobileFrontend being opinionated */
html.client-js body.skin-minerva .mbox-text-span {
margin-left: 23px !important;
}
@media (min-width: 720px) {
.ambox {
margin: 0 10%; /* 10% = Will not overlap with other elements */
}
}
29898fdc5160b39a8f580c76efe77afa1f6f58a4
Module:Message box/cmbox.css
828
45
61
2023-10-07T16:33:36Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .cmbox { margin: 3px 0; border-collapse: collapse; border: 1px solid #a2a9b1; background-color: #dfe8ff; /* Default "notice" blue */ box-sizing: border-box; } .cmbox-speedy { border: 4px solid #b32424; /* Red */ background-color: #ffdbdb; /* Pink */ } .cmbox-delete { background-color: #ffdbdb; /* Pink */ } .cmbox-content { background-color: #ffe7ce; /* Orange */ } .cmbox-style { background-color: #fff9db; /* Yellow */..."
sanitized-css
text/css
/* {{pp|small=y}} */
.cmbox {
margin: 3px 0;
border-collapse: collapse;
border: 1px solid #a2a9b1;
background-color: #dfe8ff; /* Default "notice" blue */
box-sizing: border-box;
}
.cmbox-speedy {
border: 4px solid #b32424; /* Red */
background-color: #ffdbdb; /* Pink */
}
.cmbox-delete {
background-color: #ffdbdb; /* Pink */
}
.cmbox-content {
background-color: #ffe7ce; /* Orange */
}
.cmbox-style {
background-color: #fff9db; /* Yellow */
}
.cmbox-move {
background-color: #e4d8ff; /* Purple */
}
.cmbox-protection {
background-color: #efefe1; /* Gray-gold */
}
.cmbox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.cmbox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.cmbox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.cmbox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.cmbox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.cmbox {
margin: 3px 10%;
}
}
95109477b86803acfea977ae0bce2319e72f170d
Module:Message box/fmbox.css
828
46
62
2023-10-07T16:34:48Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #a2a9b1; background-color: #f8f9fa; /* Default "system" gray */ box-sizing: border-box; } .fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background-color: #ffdbdb; /* Pink */ } .fmbox-editnotice { background-color: transparent; } .fmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .fmbox .mbox-image { border: no..."
sanitized-css
text/css
/* {{pp|small=y}} */
.fmbox {
clear: both;
margin: 0.2em 0;
width: 100%;
border: 1px solid #a2a9b1;
background-color: #f8f9fa; /* Default "system" gray */
box-sizing: border-box;
}
.fmbox-warning {
border: 1px solid #bb7070; /* Dark pink */
background-color: #ffdbdb; /* Pink */
}
.fmbox-editnotice {
background-color: transparent;
}
.fmbox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.fmbox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.fmbox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
.fmbox .mbox-invalid-type {
text-align: center;
}
fca0f5e4b400e4a2ab158b219c52822451211d66
Module:Message box/imbox.css
828
47
63
2023-10-07T16:35:53Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .imbox { margin: 4px 0; border-collapse: collapse; border: 3px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* For imboxes inside imbox-text cells. */ .imbox .mbox-text .imbox { margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */ /* TODO: Still needed? */ display: block; /* Fix for webkit to force 100% width. */ } .imbox-speedy { border: 3px solid #b32424; /* Red */ background-color..."
sanitized-css
text/css
/* {{pp|small=y}} */
.imbox {
margin: 4px 0;
border-collapse: collapse;
border: 3px solid #36c; /* Default "notice" blue */
background-color: #fbfbfb;
box-sizing: border-box;
}
/* For imboxes inside imbox-text cells. */
.imbox .mbox-text .imbox {
margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */
/* TODO: Still needed? */
display: block; /* Fix for webkit to force 100% width. */
}
.imbox-speedy {
border: 3px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.imbox-delete {
border: 3px solid #b32424; /* Red */
}
.imbox-content {
border: 3px solid #f28500; /* Orange */
}
.imbox-style {
border: 3px solid #fc3; /* Yellow */
}
.imbox-move {
border: 3px solid #9932cc; /* Purple */
}
.imbox-protection {
border: 3px solid #a2a9b1; /* Gray-gold */
}
.imbox-license {
border: 3px solid #88a; /* Dark gray */
background-color: #f7f8ff; /* Light gray */
}
.imbox-featured {
border: 3px solid #cba135; /* Brown-gold */
}
.imbox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.imbox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.imbox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.imbox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.imbox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.imbox {
margin: 4px 10%;
}
}
1e82a3c342695a9b4fbdcc4e5e0930d4845a23d4
Module:Message box/ombox.css
828
48
64
2023-10-07T16:36:28Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .ombox { margin: 4px 0; border-collapse: collapse; border: 1px solid #a2a9b1; /* Default "notice" gray */ background-color: #f8f9fa; box-sizing: border-box; } /* For the "small=yes" option. */ .ombox.mbox-small { font-size: 88%; line-height: 1.25em; } .ombox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ombox-delete { border: 2px solid #b32424; /* Red */ } .ombox-content { border: 1p..."
sanitized-css
text/css
/* {{pp|small=y}} */
.ombox {
margin: 4px 0;
border-collapse: collapse;
border: 1px solid #a2a9b1; /* Default "notice" gray */
background-color: #f8f9fa;
box-sizing: border-box;
}
/* For the "small=yes" option. */
.ombox.mbox-small {
font-size: 88%;
line-height: 1.25em;
}
.ombox-speedy {
border: 2px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ombox-delete {
border: 2px solid #b32424; /* Red */
}
.ombox-content {
border: 1px solid #f28500; /* Orange */
}
.ombox-style {
border: 1px solid #fc3; /* Yellow */
}
.ombox-move {
border: 1px solid #9932cc; /* Purple */
}
.ombox-protection {
border: 2px solid #a2a9b1; /* Gray-gold */
}
.ombox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.ombox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.ombox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ombox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ombox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.ombox {
margin: 4px 10%;
}
.ombox.mbox-small {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
width: 238px;
}
}
8fe3df4bb607e699eab2dbd23bd4a1a446391002
Module:Message box/tmbox.css
828
49
65
2023-10-07T16:37:10Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .tmbox { margin: 4px 0; border-collapse: collapse; border: 1px solid #c0c090; /* Default "notice" gray-brown */ background-color: #f8eaba; box-sizing: border-box; } /* For the "small=yes" option. */ .tmbox.mbox-small { font-size: 88%; line-height: 1.25em; } .tmbox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .tmbox-delete { border: 2px solid #b32424; /* Red */ } .tmbox-content { bord..."
sanitized-css
text/css
/* {{pp|small=y}} */
.tmbox {
margin: 4px 0;
border-collapse: collapse;
border: 1px solid #c0c090; /* Default "notice" gray-brown */
background-color: #f8eaba;
box-sizing: border-box;
}
/* For the "small=yes" option. */
.tmbox.mbox-small {
font-size: 88%;
line-height: 1.25em;
}
.tmbox-speedy {
border: 2px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.tmbox-delete {
border: 2px solid #b32424; /* Red */
}
.tmbox-content {
border: 2px solid #f28500; /* Orange */
}
.tmbox-style {
border: 2px solid #fc3; /* Yellow */
}
.tmbox-move {
border: 2px solid #9932cc; /* Purple */
}
.tmbox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.tmbox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.tmbox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.tmbox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.tmbox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.tmbox {
margin: 4px 10%;
}
.tmbox.mbox-small {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
width: 238px;
}
}
eaa4546995ebb3a8d20394cad8af74ea477bdb44
Module:Module wikitext
828
50
66
2023-10-07T16:39:27Z
Silentg
2
Created page with "local p = {} p.text = '' function p.main() return p.text end function p._addText(text, preprocessFrame) if preprocessFrame ~= false then text = (preprocessFrame or mw.getCurrentFrame()):preprocess(text) end p.text = p.text .. text end return p"
Scribunto
text/plain
local p = {}
p.text = ''
function p.main()
return p.text
end
function p._addText(text, preprocessFrame)
if preprocessFrame ~= false then
text = (preprocessFrame or mw.getCurrentFrame()):preprocess(text)
end
p.text = p.text .. text
end
return p
d3b1c2df9c8a2eb957a341073392e4c32d5e6186
Module:Module wikitext/doc
828
51
67
2023-10-07T16:41:43Z
Silentg
2
Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Twinkle standard installation}} == Usage == This is an auxiliary module used to allow module pages to display wikitext. Use it by setting this module's <code>text</code> value to whatever content you want to display. The <code>_addText</code> helper method may be useful. For example, to tag a module with {{tl|db-g7}}, put <syntaxhighlight..."
wikitext
text/x-wiki
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{Twinkle standard installation}}
== Usage ==
This is an auxiliary module used to allow module pages to display wikitext. Use it by setting this module's <code>text</code> value to whatever content you want to display. The <code>_addText</code> helper method may be useful. For example, to tag a module with {{tl|db-g7}}, put <syntaxhighlight lang="lua" inline>require('Module:Module wikitext')._addText('{{db-g7}}')</syntaxhighlight> at the top of it.
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
9721a815ef431a4233dcc3344dec4eb136b44c8b
Module:Protection banner
828
52
68
2023-10-07T16:43:06Z
Silentg
2
Created page with "-- This module implements {{pp-meta}} and its daughter templates such as -- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}. -- Initialise necessary modules. require('strict') local makeFileLink = require('Module:File link')._main local effectiveProtectionLevel = require('Module:Effective protection level')._main local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main local yesno = require('Module:Yesno') -- Lazily initialise modules and..."
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
local expiry = self.expiry
return not self:shouldHaveProtectionCategory()
or type(expiry) == 'number' and expiry < os.time()
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
894f0884d4c2da1ce19d385b96f59af654b0946a
Module:Protection banner/doc
828
53
69
2023-10-07T16:43:49Z
Silentg
2
Created page with "{{High-use}} {{Module rating|protected}} {{Lua|Module:Protection banner/config|Module:File link|Module:Effective protection level|Module:Effective protection expiry|Module:Yesno|Module:Arguments|Module:Message box|Module:Submit an edit request}} This module creates protection banners and padlock icons that are placed at the top of [[Help:Protection|protected pages]]. == Usage == Most users will not need to use this module directly. For adding protection templates to pa..."
wikitext
text/x-wiki
{{High-use}}
{{Module rating|protected}}
{{Lua|Module:Protection banner/config|Module:File link|Module:Effective protection level|Module:Effective protection expiry|Module:Yesno|Module:Arguments|Module:Message box|Module:Submit an edit request}}
This module creates protection banners and padlock icons that are placed at the top of [[Help:Protection|protected pages]].
== Usage ==
Most users will not need to use this module directly. For adding protection templates to pages you can use the {{tl|pp}} template, or you may find it more convenient to use one of the more specific protection templates in the table below.
{{protection templates}}
=== From wikitext ===
{{#invoke:Protection banner|main
| 1 = ''reason''
| small = ''yes/no''
| action = ''action''
| date = ''protection date''
| user = ''username''
| section = ''talk page section name''
| category = ''yes''
}}
The #invoke syntax can be used for creating protection templates more specific than {{tl|pp}}. For example, it is possible to create a protection template which always shows a padlock icon by using the code <code><nowiki>{{#invoke:Protection banner|main|small=yes}}</nowiki></code>. Pages which call this template will still be able to use other arguments, like ''action''. However, this only works one level deep; a page calling a template which calls another template containing the above code will not automatically be able to use parameters like ''action''.
'''''Note:''' You should no longer specify the expiry, as it is automatically retrieved in all cases.''
=== From Lua ===
First, load the module.
<syntaxhighlight lang="lua">
local mProtectionBanner = require('Module:Protection banner')
</syntaxhighlight>
Then you can make protection banners by using the _main function.
<syntaxhighlight lang="lua">
mProtectionBanner._main(args, cfg, titleObj)
</syntaxhighlight>
<var>args</var> is a table of arguments to pass to the module. For possible keys and values for this table, see the [[#Parameters|parameters section]]. The <var>cfg</var> and <var>titleObj</var> variables are intended only for testing; <var>cfg</var> specifies a customised config table to use instead of [[Module:Protection banner/config]], and <var>titleObj</var> specifies a mw.title object to use instead of the current title. <var>args</var>, <var>cfg</var> and <var>titleObj</var> are all optional.
== Parameters ==
All parameters are optional.
* '''1''' – the reason that the page was protected. If set, this must be one of the values listed in the [[#Reasons|reasons table]].
* '''small''' – if set to "yes", "y", "1", or "true", a padlock icon is generated instead of a full protection banner.
* '''action''' – the protection action. Must be one of "edit" (for normal protection), "move" (for move-protection) or "autoreview" (for pending changes). The default value is "edit".
* '''date''' – the protection date. This must be valid input to the second parameter of the [[mw:Help:Extension:ParserFunctions##time|#time parser function]]. This argument has an effect for reasons that use the PROTECTIONDATE parameter in their configuration. As of July 2014, those were the "office" and "reset" reasons.
* '''user''' – the username of the user to generate links for. As of July 2014, this only has an effect when the "usertalk" reason is specified.
* '''section''' – the section name of the protected page's talk page where discussion is taking place. This works for most, but not all, values of ''reason''.
* '''category''' – categories are suppressed if this is set to "no", "n", "0", or "false".
* '''catonly''' – if set to "yes", "y", "1", or "true", will only return the protection categories, and not return the banner or padlock. This has no visible output.
== Reasons ==
The following table contains the available reasons, plus the actions for which they are available.
{{#invoke:Protection banner/documentation|reasonTable}}
== Errors ==
Below is a list of some of the common errors that this module can produce, and how to fix them.
=== Invalid protection date ===
{{error|Error: invalid protection date ("abc")}}
This error is produced if you supply a {{para|date}} parameter value that is not recognised as a valid date by the #time parser function. If in doubt, you can just use a date in the format "dd Month YYYY", e.g. "{{#time:j F Y|+ 1 week}}". To see a full range of valid inputs, see the [[mw:Help:Extension:ParserFunctions##time|#time documentation]] (only the first parameter, the ''format string'', may be specified).
=== Invalid action ===
{{error|Error: invalid action ("abc")}}
This error is produced if you specify an invalid protection action. There are only three valid actions: <code>edit</code> (the default, for normal protection), <code>move</code> (for move-protection), and <code>autoreview</code> (for [[WP:PC|pending changes]]). This should only be possible if you are using a template that supports manually specifying the protection action, such as {{tl|pp}}, or if you are using #invoke directly. If this is not the case, please leave a message on [[Module talk:Protection banner]].
=== Reasons cannot contain the pipe character ===
{{error|Error: reasons cannot contain the pipe character ("|")}}
This error is produced if you specify a reason using the {{para|1}} parameter that includes a pipe character ("|"). Please check that you are not entering the {{tl|!}} template into this parameter by mistake. The pipe character is disallowed as the module uses it internally. A list of valid reasons can be seen in the [[#Reasons|reasons section]].
=== Other errors ===
If you see an error other than the ones above, it is likely to either be a bug in the module or mistake in the configuration. Please post a message about it at [[Module talk:Protection banner]].
== Technical details ==
This module uses configuration data from [[Module:Protection banner/config]]. Most of the module's behaviour can be configured there, making it easily portable across different wikis and different languages.
General test cases for the module can be found at [[w:en:Module:Protection banner/testcases|Module:Protection banner/testcases]], and test cases specific to enwiki's config can be found at [[w:en:Module:Protection banner/config/testcases|Module:Protection banner/config/testcases]].
Bug reports and feature requests should be made on [[w:en:Module talk:Protection banner|the module's talk page]].
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly>
6e22713a5ed5ffde7ca29e24885818a867747803
Module:Protection banner/config
828
54
70
2023-10-07T16:47:04Z
Silentg
2
Created page with "-- This module provides configuration data for [[Module:Protection banner]]. return { -------------------------------------------------------------------------------- -- -- BANNER DATA -- -------------------------------------------------------------------------------- --[[ -- Banner data consists of six fields: -- * text - the main protection text that appears at the top of protection -- banners. -- * explanation - the text that appear..."
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
tooltip = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Help:Protection|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|'
.. 'protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Help:Protection|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under extended confirmed protection',
},
move = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|protected]]'
.. ' from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Pp'] = {},
['Template:Pp-extended'] = {'ecp'},
['Template:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['Template:Pp-dispute'] = {'dispute'},
['Template:Pp-main-page'] = {'mainpage'},
['Template:Pp-move'] = {action = 'move', catonly = 'yes'},
['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Pp-office'] = {'office'},
['Template:Pp-office-dmca'] = {'dmca'},
['Template:Pp-pc'] = {action = 'autoreview', small = true},
['Template:Pp-pc1'] = {action = 'autoreview', small = true},
['Template:Pp-reset'] = {'reset'},
['Template:Pp-semi-indef'] = {small = true},
['Template:Pp-sock'] = {'sock'},
['Template:Pp-template'] = {'template', small = true},
['Template:Pp-upload'] = {action = 'upload'},
['Template:Pp-usertalk'] = {'usertalk'},
['Template:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
a20552ae38cb5253a4fa29aa126abc74215a589f
Module:Protection banner/config/doc
828
55
71
2023-10-07T16:47:41Z
Silentg
2
Created page with "{{Module rating|protected}} {{High-use}} This module contains configuration data for [[Module:Protection banner]]. For documentation please see the module comments, and if you're not sure how something works you can ask on the [[Module talk:Protection banner|module talk page]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly>"
wikitext
text/x-wiki
{{Module rating|protected}}
{{High-use}}
This module contains configuration data for [[Module:Protection banner]]. For documentation please see the module comments, and if you're not sure how something works you can ask on the [[Module talk:Protection banner|module talk page]].
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly>
6d916d45fb7e553daf4457f35dc64035a6ee81b6
Module:File link
828
56
72
2023-10-07T16:48:49Z
Silentg
2
Created page with "-- This module provides a library for formatting file wikilinks. local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local p = {} function p._main(args) checkType('_main', 1, args, 'table') -- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our -- own function to get the right error level. local function checkArg(key, val, level) if type(val) ~= 'string' then error(string.format( "type error in..."
Scribunto
text/plain
-- This module provides a library for formatting file wikilinks.
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local p = {}
function p._main(args)
checkType('_main', 1, args, 'table')
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
-- own function to get the right error level.
local function checkArg(key, val, level)
if type(val) ~= 'string' then
error(string.format(
"type error in '%s' parameter of '_main' (expected string, got %s)",
key, type(val)
), level)
end
end
local ret = {}
-- Adds a positional parameter to the buffer.
local function addPositional(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = val
end
-- Adds a named parameter to the buffer. We assume that the parameter name
-- is the same as the argument key.
local function addNamed(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = key .. '=' .. val
end
-- Filename
checkArg('file', args.file, 3)
ret[#ret + 1] = 'File:' .. args.file
-- Format
if args.format then
checkArg('format', args.format)
if args.formatfile then
checkArg('formatfile', args.formatfile)
ret[#ret + 1] = args.format .. '=' .. args.formatfile
else
ret[#ret + 1] = args.format
end
end
-- Border
if yesno(args.border) then
ret[#ret + 1] = 'border'
end
addPositional('location')
addPositional('alignment')
addPositional('size')
addNamed('upright')
addNamed('link')
addNamed('alt')
addNamed('page')
addNamed('class')
addNamed('lang')
addNamed('start')
addNamed('end')
addNamed('thumbtime')
addPositional('caption')
return string.format('[[%s]]', table.concat(ret, '|'))
end
function p.main(frame)
local origArgs = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:File link'
})
if not origArgs.file then
error("'file' parameter missing from [[Template:File link]]", 0)
end
-- Copy the arguments that were passed to a new table to avoid looking up
-- every possible parameter in the frame object.
local args = {}
for k, v in pairs(origArgs) do
-- Make _BLANK a special argument to add a blank parameter. For use in
-- conditional templates etc. it is useful for blank arguments to be
-- ignored, but we still need a way to specify them so that we can do
-- things like [[File:Example.png|link=]].
if v == '_BLANK' then
v = ''
end
args[k] = v
end
return p._main(args)
end
return p
66925f088d11530f2482f04181a3baaaa0ad3d0c
Module:File link/doc
828
57
73
2023-10-07T16:49:25Z
Silentg
2
Created page with "{{high-use}} {{Module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module is used to construct wikitext links to files. It is primarily useful for templates and modules that use complicated logic to make file links. Simple file links should be made with wikitext markup directly, as it uses less resources than calling this module. For help with wikitext file markup please refer to the [[mw:Help:Images|documentation at mediawiki.org]]. == Usage from wikit..."
wikitext
text/x-wiki
{{high-use}}
{{Module rating|protected}}
{{Lua|Module:Yesno|Module:Arguments}}
This module is used to construct wikitext links to files. It is primarily useful for templates and modules that use complicated logic to make file links. Simple file links should be made with wikitext markup directly, as it uses less resources than calling this module. For help with wikitext file markup please refer to the [[mw:Help:Images|documentation at mediawiki.org]].
== Usage from wikitext ==
From wikitext, this module should be called from a template, usually {{tl|file link}}. Please see the template page for documentation. However, it can also be called using the syntax <code><nowiki>{{#invoke:File link|main|</nowiki>''arguments''<nowiki>}}</nowiki></code>.
== Usage from Lua ==
First, you need to import the module.
<syntaxhighlight lang="lua">
local mFileLink = require('Module:File link')
</syntaxhighlight>
Then you can make file links using the <code>_main</code> function.
<syntaxhighlight lang="lua">
mFileLink._main(args)
</syntaxhighlight>
<var>args</var> is a table of arguments that can have the following keys:
* <code>file</code> - the filename. (required)
* <code>format</code> - the file format, e.g. 'thumb', 'thumbnail', 'frame', 'framed', or 'frameless'.
* <code>formatfile</code> - a filename to specify with the 'thumbnail' format option. The filename specified will be used instead of the automatically generated thumbnail.
* <code>border</code> - set this to true or "yes" (or any other value recognized as true by [[Module:Yesno]]) to set a border for the image.
* <code>location</code> - the horizontal alignment of the file, e.g. 'right', 'left', 'center', or 'none'.
* <code>alignment</code> - the vertical alignment of the file, e.g. 'baseline', 'middle', 'sub', 'super', 'text-top', 'text-bottom', 'top', or 'bottom'.
* <code>size</code> - the size of the image, e.g. '100px', 'x100px' or '100x100px'.
* <code>upright</code> - the 'upright' parameter, used for setting the size of tall and thin images.
* <code>link</code> - the page that the file should link to. Use the blank string <nowiki>''</nowiki> to suppress the default link to the file description page.
* <code>alt</code> - the alt text. Use the blank string <nowiki>''</nowiki> to suppress the default alt text.
* <code>caption</code> - a caption for the file.
* <code>page</code> - sets a page number for multi-paged files such as PDFs.
* <code>class</code> - adds a <code>class</code> parameter to image links. The MediaWiki software adds this parameter to the <code>class="..."</code> attribute of the image's <code><nowiki><img /></nowiki></code> element when the page is rendered into HTML.
* <code>lang</code> - adds a language attribute to specify what language to render the file in.
* <code>start</code> - specifies a start time for audio and video files.
* <code>end</code> - specifies an end time for audio and video files.
* <code>thumbtime</code> - specifies the time to use to generate the thumbnail image for video files.
To see the effect of each of these parameters, see the [[mw:Help:Images#Format|images help page on mediawiki.org]].
=== Examples ===
With the file only:
<syntaxhighlight lang="lua">
mFileLink.main{file = 'Example.png'}
-- Renders as [[File:Example.png]]
</syntaxhighlight>
With format, size, link and caption options:
<syntaxhighlight lang="lua">
mFileLink.main{
file = 'Example.png',
format = 'thumb',
size = '220px',
link = 'Wikipedia:Sandbox',
caption = 'An example.'
}
-- Renders as [[File:Example.png|thumb|220px|link=Wikipedia:Sandbox|An example.]]
</syntaxhighlight>
With format, size, and border:
<syntaxhighlight lang="lua">
mFileLink.main{
file = 'Example.png',
format = 'frameless',
size = '220px',
border = true
}
-- Renders as [[File:Example.png|frameless|border|220px]]
</syntaxhighlight>
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly>
3ed97b9b6e53a4e041285a77da0c01f25e581d13
Module:Effective protection level
828
58
74
2023-10-07T16:50:42Z
Silentg
2
Created page with "local p = {} -- Returns the permission required to perform a given action on a given title. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'autoreview' then local leve..."
Scribunto
text/plain
local p = {}
-- Returns the permission required to perform a given action on a given title.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local level = mw.ext.FlaggedRevs.getStabilitySettings(title)
level = level and level.autoreview
if level == 'review' then
return 'reviewer'
elseif level ~= '' then
return level
else
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
end
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 )
end
if title.namespace == 8 then -- MediaWiki namespace
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page
return 'interfaceadmin'
else -- any non-JS/CSS MediaWiki page
return 'sysop'
end
elseif title.namespace == 2 and title.isSubpage then
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page
return 'interfaceadmin'
elseif title.contentModel == 'json' then -- user JSON page
return 'sysop'
end
end
if action == 'undelete' then
return 'sysop'
end
local level = title.protectionLevels[action] and title.protectionLevels[action][1]
if level == 'sysop' or level == 'editprotected' then
return 'sysop'
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page
return 'sysop'
elseif level == 'templateeditor' then
return 'templateeditor'
elseif action == 'move' then
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
if blacklistentry and not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif title.namespace == 6 then
return 'filemover'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
end
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason
return 'autoconfirmed'
elseif level then
return level
elseif action == 'upload' then
return 'autoconfirmed'
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
return 'user'
else
return '*'
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
70256a489edf6be9808031b14a7e3ef3e025da97
Module:Effective protection level/doc
828
59
75
2023-10-07T16:51:41Z
Silentg
2
Created page with "{{Module rating|protected}} {{used in system}} This module provides a way to retrieve the group required to perform a given action on a page. It currently tests the following criteria: * The page being pending-changes protected: autoconfirmed * The page being a JavaScript or CSS subpage in userspace, or in the MediaWiki namespace: interfaceadmin * The page being in the MediaWiki namespace: sysop * The page being a JSON subpage in userspace: sysop * The page being protec..."
wikitext
text/x-wiki
{{Module rating|protected}}
{{used in system}}
This module provides a way to retrieve the group required to perform a given action on a page. It currently tests the following criteria:
* The page being pending-changes protected: autoconfirmed
* The page being a JavaScript or CSS subpage in userspace, or in the MediaWiki namespace: interfaceadmin
* The page being in the MediaWiki namespace: sysop
* The page being a JSON subpage in userspace: sysop
* The page being protected: sysop, templateeditor, extendedconfirmed, or autoconfirmed
* The page being used in a cascading-protected page: sysop
* The page's title matching the titleblacklist: templateeditor or autoconfirmed
* A file being moved: filemover
* A page being moved or a file being uploaded: autoconfirmed
* A non-Draft non-talk page being created: user
* Anything else: *
Note that if a template-protected file is moved, both filemover and templateeditor are required, but this will return only templateeditor. This is not likely to be changed any time soon, since template protection currently shouldn't be used on files.
== Usage ==
'''Warning:''' This module will use up to 4 expensive parser function calls each time it is ran. It should only be used if the exact effective protection level is necessary. Otherwise, consider using title.protectionLevels instead.
=== From other modules ===
To load this module:
<syntaxhighlight lang="lua">
local effectiveProtectionLevel = require('Module:Effective protection level')._main
</syntaxhighlight>
The function accepts two parameters. The first is a string containing the action to check, which must be one of "edit", "create", "move", "upload", "undelete", or "autoreview". The second is optional, and can either be the name of the page to check, or a title returned from the mw.title functions. If the second parameter is omitted, the page being displayed is the one checked against. The return value is a string containing the name of the group required to perform the given action.
=== From wikitext ===
The parameters are the same as when it is called directly.
{{tlinv|Effective protection level|''action''|''title''}}
== See also ==
* [[Module:Effective protection expiry]]
19dafcf910d95f27ad7d21d097ffec985e26d3ec
Module:Effective protection expiry
828
60
76
2023-10-07T16:52:31Z
Silentg
2
Created page with "local p = {} -- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'auto..."
Scribunto
text/plain
local p = {}
-- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title)
return stabilitySettings and stabilitySettings.expiry or 'unknown'
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' then
error( 'First parameter must be one of edit, move, create, upload, autoreview', 2 )
end
local rawExpiry = mw.getCurrentFrame():callParserFunction('PROTECTIONEXPIRY', action, pagename)
if rawExpiry == 'infinity' then
return 'infinity'
elseif rawExpiry == '' then
return 'unknown'
else
local year, month, day, hour, minute, second = rawExpiry:match(
'^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$'
)
if year then
return string.format(
'%s-%s-%sT%s:%s:%s',
year, month, day, hour, minute, second
)
else
error('internal error in Module:Effective protection expiry; malformed expiry timestamp')
end
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
9a8c58dc2667232ed08a9b206a5d89ca8150312b
Module:Effective protection expiry/doc
828
61
77
2023-10-07T16:53:09Z
Silentg
2
Created page with "{{Module rating |protected <!-- Values: pre-alpha • alpha • beta • release • protected -- If a rating not needed/relevant, delete this template call -->}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This module provides a way to retrieve the expiry of a restriction over a given action on a page. == Usage == This module will use up to 1 expensive parser function call each..."
wikitext
text/x-wiki
{{Module rating |protected <!-- Values: pre-alpha • alpha • beta • release • protected -- If a rating not needed/relevant, delete this template call -->}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
This module provides a way to retrieve the expiry of a restriction over a given action on a page.
== Usage ==
This module will use up to 1 expensive parser function call each time it is ran. It will not use any if [[Module:Effective protection level]] was already called.
=== From other modules ===
To load this module:
<syntaxhighlight lang="lua">
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
</syntaxhighlight>
The function accepts two parameters. The first is a string containing the action to check, which must be one of "edit", "create", "move", "upload", or "autoreview". The second is optional, and can either be the name of the page to check, or a title returned from the mw.title functions. If the second parameter is omitted, the page being displayed is the one checked against.
The return value is either a date string in <code>YY-MM-DDThh:mm:ss</code> format, or one of the following strings:
* <code>infinity</code> - for pages protected indefinitely, or pages which exist and are not protected
* <code>unknown</code> - for pages where the expiry is unknown, or pages which do not exist and are not protected
Note that if an existing page is not protected for the requested action, this will return 'infinity'. You need to check separately with [[Module:Effective protection level]].
=== From wikitext ===
The parameters are the same as when it is called directly.
{{tlinv|Effective protection expiry|''action''|''title''}}
== See also ==
* [[Module:Effective protection level]]
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
923a62d4c7f740186b63c3eccaeac625b3a0bfaa
Module:Submit an edit request
828
62
78
2023-10-07T16:54:58Z
Silentg
2
Created page with "-- This module implements {{Submit an edit request}}. local CONFIG_MODULE = 'Module:Submit an edit request/config' -- Load necessary modules local mRedirect = require('Module:Redirect') local cfg = mw.loadData(CONFIG_MODULE) local effectiveProtectionLevel = require('Module:Effective protection level')._main local escape = require("Module:String")._escapePattern local lang = mw.language.getContentLanguage() local p = {} local validLevels = { semi = 'semi', extended..."
Scribunto
text/plain
-- This module implements {{Submit an edit request}}.
local CONFIG_MODULE = 'Module:Submit an edit request/config'
-- Load necessary modules
local mRedirect = require('Module:Redirect')
local cfg = mw.loadData(CONFIG_MODULE)
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local escape = require("Module:String")._escapePattern
local lang = mw.language.getContentLanguage()
local p = {}
local validLevels = {
semi = 'semi',
extended = 'extended',
template = 'template',
full = 'full',
interface = 'interface',
manual = 'manual'
}
local function message(key, ...)
local params = {...}
local msg = cfg[key]
if #params < 1 then
return msg
else
return mw.message.newRawMessage(msg):params(params):plain()
end
end
local function validateLevel(level)
return level and validLevels[level] or 'full'
end
local function getLevelInfo(level, field)
return cfg.protectionLevels[level][field]
end
local function resolveRedirect(page)
return mRedirect.luaMain(page)
end
local function isProtected(page)
local action = mw.title.new(page).exists and 'edit' or 'create'
return effectiveProtectionLevel(action, page) ~= '*'
end
function p.makeRequestUrl(level, titleObj)
titleObj = titleObj or mw.title.getCurrentTitle()
local basePage = titleObj.basePageTitle.fullText
if cfg['main-page-content'][basePage] then
return tostring(mw.uri.fullUrl(message('main-page-request-page')))
end
local talkPageName = titleObj.talkPageTitle
if talkPageName == nil then
return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page')))
end
talkPageName = resolveRedirect(talkPageName.prefixedText)
if isProtected(talkPageName) then
return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page')))
end
level = validateLevel(level)
if level == 'manual' then
return tostring(mw.uri.fullUrl(talkPageName, {
action = 'edit',
section = 'new'
}))
end
local sectionname = message(
'preload-title-text',
getLevelInfo(level, 'levelText'),
lang:formatDate(message('preload-title-date-format'))
)
local content = mw.title.new(talkPageName):getContent()
if content and content:find("== *" .. escape(sectionname) .. " *==") then
local dedup = 2
while true do
local newname = message("preload-title-dedup-suffix", sectionname, dedup)
if not content:find("== *" .. escape(newname) .. " *==") then
sectionname = newname
break
end
dedup = dedup + 1
end
end
local url = mw.uri.fullUrl(talkPageName, {
action = 'edit',
editintro = getLevelInfo(level, 'editintro'),
preload = message('preload-template'),
preloadtitle = sectionname,
section = 'new'
})
url = tostring(url)
-- Add the preload parameters. @TODO: merge this into the mw.uri.fullUrl
-- query table once [[phab:T93059]] is fixed.
local function encodeParam(key, val)
return string.format('&%s=%s', mw.uri.encode(key), mw.uri.encode(val))
end
url = url .. encodeParam('preloadparams[]', getLevelInfo(level, 'requestTemplate'))
url = url .. encodeParam('preloadparams[]', titleObj.prefixedText)
return url
end
function p._link(args)
return string.format(
'<span class="plainlinks">[%s %s]</span>',
p.makeRequestUrl(args.type),
args.display or message('default-display-value')
)
end
function p._button(args)
return require('Module:Clickable button 2').luaMain{
[1] = args.display or message('default-display-value'),
url = p.makeRequestUrl(args.type),
class = 'mw-ui-progressive'
}
end
local function makeInvokeFunc(func, wrapper)
return function (frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = {wrapper}
})
return func(args)
end
end
p.link = makeInvokeFunc(p._link, message('link-wrapper-template'))
p.button = makeInvokeFunc(p._button, message('button-wrapper-template'))
return p
13fad0a3da4e4a2ebb0dd8029958487cc63f312a
Module:Submit an edit request/doc
828
63
79
2023-10-07T16:57:26Z
Silentg
2
Created page with "{{used in system}} {{Lua|Module:Redirect|Module:Effective protection level|Module:String|Module:Arguments|Module:Clickable button 2}} This module implements the {{tl|submit an edit request}} and {{tl|submit an edit request/link}} templates. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Submit an edit request}} and {{Template link|Submit an edit request/link}} templates. However, the module can also be used direc..."
wikitext
text/x-wiki
{{used in system}}
{{Lua|Module:Redirect|Module:Effective protection level|Module:String|Module:Arguments|Module:Clickable button 2}}
This module implements the {{tl|submit an edit request}} and {{tl|submit an edit request/link}} templates.
== Usage from wikitext ==
To use this module from wikitext, you should normally use the {{Template link|Submit an edit request}} and {{Template link|Submit an edit request/link}} templates. However, the module can also be used directly from #invoke. For the edit request button, use <code><nowiki>{{#invoke:Submit an edit request|button|</nowiki>''args''<nowiki>}}</nowiki></code>, and for the edit request link only, use <code><nowiki>{{#invoke:Submit an edit request|link|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the respective template pages for a list of available parameters.
== Usage from Lua modules ==
To use this module from other Lua modules, first load the module.
<syntaxhighlight lang="lua">
local mEditRequest = require('Module:Submit an edit request')
</syntaxhighlight>
You can then use the _button function to generate an edit request button, and the _link function to generate an edit request link.
<syntaxhighlight lang="lua">
mEditRequest._button(args)
mEditRequest._link(args)
</syntaxhighlight>
The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the documentation of {{tl|Submit an edit request}} and {{tl|Submit an edit request/link}}.
== Configuration ==
This module can be translated and configured for other wikis by editing [[Module:Submit an edit request/config]].
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly>
2531dba5e0bf66d46b387d0141e6fc6f73dd2cc3
Module:Redirect
828
64
80
2023-10-07T16:59:26Z
Silentg
2
Created page with "-- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redi..."
Scribunto
text/plain
-- This module provides functions for getting the target of a redirect page.
local p = {}
-- Gets a mw.title object, using pcall to avoid generating script errors if we
-- are over the expensive function count limit (among other possible causes).
local function getTitle(...)
local success, titleObj = pcall(mw.title.new, ...)
if success then
return titleObj
else
return nil
end
end
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
-- redirect.
function p.getTargetFromText(text)
local target = string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
return target and mw.uri.decode(target, 'PATH')
end
-- Gets the target of a redirect. If the page specified is not a redirect,
-- returns nil.
function p.getTarget(page, fulltext)
-- Get the title object. Both page names and title objects are allowed
-- as input.
local titleObj
if type(page) == 'string' or type(page) == 'number' then
titleObj = getTitle(page)
elseif type(page) == 'table' and type(page.getContent) == 'function' then
titleObj = page
else
error(string.format(
"bad argument #1 to 'getTarget'"
.. " (string, number, or title object expected, got %s)",
type(page)
), 2)
end
if not titleObj then
return nil
end
local targetTitle = titleObj.redirectTarget
if targetTitle then
if fulltext then
return targetTitle.fullText
else
return targetTitle.prefixedText
end
else
return nil
end
end
--[[
-- Given a single page name determines what page it redirects to and returns the
-- target page name, or the passed page name when not a redirect. The passed
-- page name can be given as plain text or as a page link.
--
-- Returns page name as plain text, or when the bracket parameter is given, as a
-- page link. Returns an error message when page does not exist or the redirect
-- target cannot be determined for some reason.
--]]
function p.luaMain(rname, bracket, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
return nil
end
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTarget(rname, fulltext)
local ret = target or rname
ret = getTitle(ret)
if ret then
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
else
return nil
end
end
-- Provides access to the luaMain function from wikitext.
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
-- Returns true if the specified page is a redirect, and false otherwise.
function p.luaIsRedirect(page)
local titleObj = getTitle(page)
if not titleObj then
return false
end
if titleObj.isRedirect then
return true
else
return false
end
end
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
-- if the specified page is a redirect, and the blank string otherwise.
function p.isRedirect(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
if p.luaIsRedirect(args[1]) then
return 'yes'
else
return ''
end
end
return p
a224c45940343d66f49a78b0a39b2045e2c45d20
Module:Redirect/doc
828
65
81
2023-10-07T16:59:57Z
Silentg
2
Created page with "{{used in system}} {{Module rating|beta}} {{Module rating|protected}} {{Lua|Module:Arguments}} This module contains functions to find the target of a [[Help:Redirect|redirect]] page. == Main == The main function accepts the name of a single page. It determines if the page is a redirect; if so it looks up the page, extracts the target, and returns the target name as text. Its usage is <code><nowiki>{{#invoke:redirect|main|page-name}}</nowiki></code>. If <code>page-name..."
wikitext
text/x-wiki
{{used in system}}
{{Module rating|beta}}
{{Module rating|protected}}
{{Lua|Module:Arguments}}
This module contains functions to find the target of a [[Help:Redirect|redirect]] page.
== Main ==
The main function accepts the name of a single page. It determines if the page is a redirect; if so it looks up the page, extracts the target, and returns the target name as text. Its usage is <code><nowiki>{{#invoke:redirect|main|page-name}}</nowiki></code>. If <code>page-name</code> does not exist or is not a redirect then <code>page-name</code> is returned. If <code>page-name</code> is blank then blank is returned.
The function normally neither takes nor gives square brackets, so to show the result as a link use <code><nowiki>[[{{#invoke:redirect|main|page-name}}]]</nowiki></code>.
If the parameter ''bracket'' is given a nonblank value, brackets will be passed on if present.
=== Examples ===
* <code><nowiki>{{#invoke:redirect|main|WP:AFC}}</nowiki></code> → {{#invoke:redirect|main|WP:AFC}}
* <code><nowiki>{{#invoke:redirect|main|[[WP:AFD]]|bracket=yes}}</nowiki></code> → {{#invoke:redirect|main|[[WP:AFD]]|bracket=yes}}
* <code><nowiki>{{#invoke:redirect|main|Wikipedia:Articles for deletion}}</nowiki></code> → {{#invoke:redirect|main|Wikipedia:Articles for deletion}}
* <code><nowiki>{{#invoke:redirect|main|Wikipedia:Articles for rumination}}</nowiki></code> → {{#invoke:redirect|main|Wikipedia:Articles for rumination}}
Note: [[WP:AFC]] and [[WP:AFD]] are both redirects, but [[Wikipedia:Articles for deletion]] is not, and [[Wikipedia:Articles for rumination]] does not exist.
=== LuaMain ===
If you want to use the main function from another Lua module, you may want to use the luaMain function. This provides the same functionality as the main function, but doesn't require that a frame object be available.
To use this, first load the module.
<syntaxhighlight lang="lua">
local mRedirect = require('Module:Redirect')
</syntaxhighlight>
Then use the function with the following syntax:
<syntaxhighlight lang="lua">
mRedirect.luaMain(rname, bracket)
</syntaxhighlight>
<var>rname</var> is the name of the redirect page, and if <var>bracket</var> is anything but false or nil, the module will produce a link rather than just a page name.
== IsRedirect ==
The isRedirect function is used from wiki pages to find out if a given page is a redirect or not. If the page is a redirect, the function returns "yes", and if not the output is blank. Its usage is <code><nowiki>{{#invoke:redirect|isRedirect|page-name}}</nowiki></code>.
=== Examples ===
* <code><nowiki>{{#invoke:redirect|isRedirect|WP:AFC}}</nowiki></code> → {{#invoke:redirect|isRedirect|WP:AFC}}
* <code><nowiki>{{#invoke:redirect|isRedirect|Wikipedia:Articles for deletion}}</nowiki></code> → {{#invoke:redirect|isRedirect|Wikipedia:Articles for deletion}}
* <code><nowiki>{{#invoke:redirect|isRedirect|Wikipedia:Articles for rumination}}</nowiki></code> → {{#invoke:redirect|isRedirect|Wikipedia:Articles for rumination}}
=== LuaIsRedirect ===
The isRedirect can be accessed from other Lua modules in the same way as the main function:
<syntaxhighlight lang="lua">
local mRedirect = require('Module:Redirect')
mRedirect.luaIsRedirect(rname)
</syntaxhighlight>
== GetTarget ==
The getTarget function fetches the target page name of a redirect page, and is only usable from Lua. If the page specified is a redirect, then the target is returned; otherwise the function returns nil.
To use it, first load the module.
<syntaxhighlight lang="lua">
local mRedirect = require('Module:Redirect')
</syntaxhighlight>
Then use the function with the following syntax:
<syntaxhighlight lang="lua">
mRedirect.getTarget(page)
</syntaxhighlight>
<var>page</var> can be either the name of the redirect page as a string, or a [[mw:Extension:Scribunto/Lua reference manual#Title objects|mw.title object]].
==See also==
* [[phab:T68974]] - Provide a standard way to get the target of a redirect page
* [[mw:Extension:Scribunto/Lua reference manual#Title objects]], the Scribunto interface for determining a page's redirect status
* [[Template:Get QID]], which uses this module
* [[Template:Submit an edit request]], which uses this module
5f6a910dca958e44d69cb8b0d2d18a8efe6dd728
Module:String
828
66
82
2023-10-07T17:01:13Z
Silentg
2
Created page with "--[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error c..."
Scribunto
text/plain
--[[
This module is intended to provide access to basic string functions.
Most of the functions provided here can be invoked with named parameters,
unnamed parameters, or a mixture. If named parameters are used, Mediawiki will
automatically remove any leading or trailing whitespace from the parameter.
Depending on the intended use, it may be advantageous to either preserve or
remove such whitespace.
Global options
ignore_errors: If set to 'true' or 1, any error condition will result in
an empty string being returned rather than an error message.
error_category: If an error occurs, specifies the name of a category to
include with the error message. The default category is
[Category:Errors reported by Module String].
no_category: If set to 'true' or 1, no category will be added if an error
is generated.
Unit tests for this module are available at Module:String/tests.
]]
local str = {}
--[[
len
This function returns the length of the target string.
Usage:
{{#invoke:String|len|target_string|}}
OR
{{#invoke:String|len|s=target_string}}
Parameters
s: The string whose length to report
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string.
]]
function str.len( frame )
local new_args = str._getParameters( frame.args, {'s'} )
local s = new_args['s'] or ''
return mw.ustring.len( s )
end
--[[
sub
This function returns a substring of the target string at specified indices.
Usage:
{{#invoke:String|sub|target_string|start_index|end_index}}
OR
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}
Parameters
s: The string to return a subset of
i: The fist index of the substring to return, defaults to 1.
j: The last index of the string to return, defaults to the last character.
The first character of the string is assigned an index of 1. If either i or j
is a negative value, it is interpreted the same as selecting a character by
counting from the end of the string. Hence, a value of -1 is the same as
selecting the last character of the string.
If the requested indices are out of range for the given string, an error is
reported.
]]
function str.sub( frame )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local s = new_args['s'] or ''
local i = tonumber( new_args['i'] ) or 1
local j = tonumber( new_args['j'] ) or -1
local len = mw.ustring.len( s )
-- Convert negatives for range checking
if i < 0 then
i = len + i + 1
end
if j < 0 then
j = len + j + 1
end
if i > len or j > len or i < 1 or j < 1 then
return str._error( 'String subset index out of range' )
end
if j < i then
return str._error( 'String subset indices out of order' )
end
return mw.ustring.sub( s, i, j )
end
--[[
This function implements that features of {{str sub old}} and is kept in order
to maintain these older templates.
]]
function str.sublength( frame )
local i = tonumber( frame.args.i ) or 0
local len = tonumber( frame.args.len )
return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )
end
--[[
_match
This function returns a substring from the source string that matches a
specified pattern. It is exported for use in other modules
Usage:
strmatch = require("Module:String")._match
sresult = strmatch( s, pattern, start, match, plain, nomatch )
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This sub-routine is exported for use in other modules
function str._match( s, pattern, start, match_index, plain_flag, nomatch )
if s == '' then
return str._error( 'Target string is empty' )
end
if pattern == '' then
return str._error( 'Pattern string is empty' )
end
start = tonumber(start) or 1
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Requested start is out of range' )
end
if match_index == 0 then
return str._error( 'Match index is out of range' )
end
if plain_flag then
pattern = str._escapePattern( pattern )
end
local result
if match_index == 1 then
-- Find first match is simple case
result = mw.ustring.match( s, pattern, start )
else
if start > 1 then
s = mw.ustring.sub( s, start )
end
local iterator = mw.ustring.gmatch(s, pattern)
if match_index > 0 then
-- Forward search
for w in iterator do
match_index = match_index - 1
if match_index == 0 then
result = w
break
end
end
else
-- Reverse search
local result_table = {}
local count = 1
for w in iterator do
result_table[count] = w
count = count + 1
end
result = result_table[ count + match_index ]
end
end
if result == nil then
if nomatch == nil then
return str._error( 'Match not found' )
else
return nomatch
end
else
return result
end
end
--[[
match
This function returns a substring from the source string that matches a
specified pattern.
Usage:
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from each string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
If the match_number or start_index are out of range for the string being queried, then
this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and
an empty string will be returned on any failure.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This is the entry point for #invoke:String|match
function str.match( frame )
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
local s = new_args['s'] or ''
local start = tonumber( new_args['start'] ) or 1
local plain_flag = str._getBoolean( new_args['plain'] or false )
local pattern = new_args['pattern'] or ''
local match_index = math.floor( tonumber(new_args['match']) or 1 )
local nomatch = new_args['nomatch']
return str._match( s, pattern, start, match_index, plain_flag, nomatch )
end
--[[
pos
This function returns a single character from the target string at position pos.
Usage:
{{#invoke:String|pos|target_string|index_value}}
OR
{{#invoke:String|pos|target=target_string|pos=index_value}}
Parameters
target: The string to search
pos: The index for the character to return
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
The first character has an index value of 1.
If one requests a negative value, this function will select a character by counting backwards
from the end of the string. In other words pos = -1 is the same as asking for the last character.
A requested value of zero, or a value greater than the length of the string returns an error.
]]
function str.pos( frame )
local new_args = str._getParameters( frame.args, {'target', 'pos'} )
local target_str = new_args['target'] or ''
local pos = tonumber( new_args['pos'] ) or 0
if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then
return str._error( 'String index out of range' )
end
return mw.ustring.sub( target_str, pos, pos )
end
--[[
str_find
This function duplicates the behavior of {{str_find}}, including all of its quirks.
This is provided in order to support existing templates, but is NOT RECOMMENDED for
new code and templates. New code is recommended to use the "find" function instead.
Returns the first index in "source" that is a match to "target". Indexing is 1-based,
and the function returns -1 if the "target" string is not present in "source".
Important Note: If the "target" string is empty / missing, this function returns a
value of "1", which is generally unexpected behavior, and must be accounted for
separatetly.
]]
function str.str_find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target'} )
local source_str = new_args['source'] or ''
local target_str = new_args['target'] or ''
if target_str == '' then
return 1
end
local start = mw.ustring.find( source_str, target_str, 1, true )
if start == nil then
start = -1
end
return start
end
--[[
find
This function allows one to search for a target string or pattern within another
string.
Usage:
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}
OR
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}
Parameters
source: The string to search
target: The string or pattern to find within source
start: The index within the source string to start the search, defaults to 1
plain: Boolean flag indicating that target should be understood as plain
text and not as a Lua style regular expression, defaults to true
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the parameter. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
This function returns the first index >= "start" where "target" can be found
within "source". Indices are 1-based. If "target" is not found, then this
function returns 0. If either "source" or "target" are missing / empty, this
function also returns 0.
This function should be safe for UTF-8 strings.
]]
function str.find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['target'] or ''
local start_pos = tonumber(new_args['start']) or 1
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return 0
end
plain = str._getBoolean( plain )
local start = mw.ustring.find( source_str, pattern, start_pos, plain )
if start == nil then
start = 0
end
return start
end
--[[
replace
This function allows one to replace a target string or pattern within another
string.
Usage:
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
OR
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
count=replacement_count|plain=plain_flag}}
Parameters
source: The string to search
pattern: The string or pattern to find within source
replace: The replacement text
count: The number of occurences to replace, defaults to all.
plain: Boolean flag indicating that pattern should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
function str.replace( frame )
local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['pattern'] or ''
local replace = new_args['replace'] or ''
local count = tonumber( new_args['count'] )
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return source_str
end
plain = str._getBoolean( plain )
if plain then
pattern = str._escapePattern( pattern )
replace = mw.ustring.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences.
end
local result
if count ~= nil then
result = mw.ustring.gsub( source_str, pattern, replace, count )
else
result = mw.ustring.gsub( source_str, pattern, replace )
end
return result
end
--[[
simple function to pipe string.rep to templates.
]]
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
end
return string.rep( frame.args[1] or '', repetitions )
end
--[[
escapePattern
This function escapes special characters from a Lua string pattern. See [1]
for details on how patterns work.
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
Usage:
{{#invoke:String|escapePattern|pattern_string}}
Parameters
pattern_string: The pattern string to escape.
]]
function str.escapePattern( frame )
local pattern_str = frame.args[1]
if not pattern_str then
return str._error( 'No pattern string specified' )
end
local result = str._escapePattern( pattern_str )
return result
end
--[[
count
This function counts the number of occurrences of one string in another.
]]
function str.count(frame)
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
local source = args.source or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
if plain then
pattern = str._escapePattern(pattern)
end
local _, count = mw.ustring.gsub(source, pattern, '')
return count
end
--[[
endswith
This function determines whether a string ends with another string.
]]
function str.endswith(frame)
local args = str._getParameters(frame.args, {'source', 'pattern'})
local source = args.source or ''
local pattern = args.pattern or ''
if pattern == '' then
-- All strings end with the empty string.
return "yes"
end
if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then
return "yes"
else
return ""
end
end
--[[
join
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
local args = {}
local sep
for _, v in ipairs( frame.args ) do
if sep then
if v ~= '' then
table.insert(args, v)
end
else
sep = v
end
end
return table.concat( args, sep or '' )
end
--[[
Helper function that populates the argument list given that user may need to use a mix of
named and unnamed parameters. This is relevant because named parameters are not
identical to unnamed parameters due to string trimming, and when dealing with strings
we sometimes want to either preserve or remove that whitespace depending on the application.
]]
function str._getParameters( frame_args, arg_list )
local new_args = {}
local index = 1
local value
for _, arg in ipairs( arg_list ) do
value = frame_args[arg]
if value == nil then
value = frame_args[index]
index = index + 1
end
new_args[arg] = value
end
return new_args
end
--[[
Helper function to handle error messages.
]]
function str._error( error_str )
local frame = mw.getCurrentFrame()
local error_category = frame.args.error_category or 'Errors reported by Module String'
local ignore_errors = frame.args.ignore_errors or false
local no_category = frame.args.no_category or false
if str._getBoolean(ignore_errors) then
return ''
end
local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>'
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str
end
return error_str
end
--[[
Helper Function to interpret boolean strings
]]
function str._getBoolean( boolean_str )
local boolean_value
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower()
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
or boolean_str == '' then
boolean_value = false
else
boolean_value = true
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str
else
error( 'No boolean value found' )
end
return boolean_value
end
--[[
Helper function that escapes all pattern characters so that they will be treated
as plain text.
]]
function str._escapePattern( pattern_str )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
end
return str
6df794dd52434e0f6a372c9918f5a9dedd15f579
Module:String/doc
828
67
83
2023-10-07T17:01:58Z
Silentg
2
Created page with "{{Used in system}} {{Module rating|protected}} {{Lmd|String}} This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. == Global..."
wikitext
text/x-wiki
{{Used in system}}
{{Module rating|protected}}
{{Lmd|String}}
This module is intended to provide access to basic string functions.
Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace.
== Global options ==
; ignore_errors
: If set to 'true' or 1, any error condition will result in an empty string being returned rather than an error message.
; error_category
: If an error occurs, specifies the name of a category to include with the error message. The default category is {{clc|Errors reported by Module String}}.
; no_category
: If set to 'true' or 1, no category will be added if an error is generated.
Unit tests for this module are available at [[Module:String/testcases]].
== len ==
This function returns the length of the target string.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|len|''target_string''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|len|s= ''target_string'' }}</code>
Parameters:
; s
: The string whose length to report
Examples:
* <code><nowiki>{{#invoke:String|len| abcdefghi }}</nowiki></code> → {{#invoke:String|len| abcdefghi }}
* <code><nowiki>{{#invoke:String|len|s= abcdefghi }}</nowiki></code> → {{#invoke:String|len|s= abcdefghi }}
== sub ==
This function returns a substring of the target string at specified inclusive, one-indexed indices.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|sub|''target_string''|''start_index''|''end_index''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|sub|s= ''target_string'' |i= ''start_index'' |j= ''end_index'' }}</code>
Parameters:
; s
: The string to return a subset of
; i
: The first index of the substring to return, defaults to 1.
; j
: The last index of the string to return, defaults to the last character.
The first character of the string is assigned an index of 1. If either i or j is a negative value, it is interpreted the same as selecting a character by counting from the end of the string. Hence, a value of -1 is the same as selecting the last character of the string.
If the requested indices are out of range for the given string, an error is reported. To avoid error messages, use {{ml|ustring|sub}} instead.
Examples:
* <code><nowiki>"{{#invoke:String|sub| abcdefghi }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi }}"
* <code><nowiki>"{{#invoke:String|sub|s= abcdefghi }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi }}"
* <code><nowiki>"{{#invoke:String|sub| abcdefghi | 3 }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi | 3 }}"
* <code><nowiki>"{{#invoke:String|sub|s= abcdefghi |i= 3 }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi |i= 3 }}"
* <code><nowiki>"{{#invoke:String|sub| abcdefghi | 3 | 4 }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi | 3 | 4 }}"
* <code><nowiki>"{{#invoke:String|sub|s= abcdefghi |i= 3 |j= 4 }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi |i= 3 |j= 4 }}"
== sublength ==
This function implements the features of {{tl|str sub old}} and is kept in order to maintain these older templates. It returns a substring of the target string starting at a specified index and of a specified length.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|sublength|s= ''target_string'' |i= ''start_index'' |len= ''length'' }}</code>
Parameters:
; s
: The string
; i
: The starting index of the substring to return. The first character of the string is assigned an index of 0.
; len
: The length of the string to return, defaults to the last character.
Examples:
* <code><nowiki>{{#invoke:String|sublength|s= abcdefghi }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi }}
* <code><nowiki>{{#invoke:String|sublength|s= abcdefghi |i= 3 }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi |i= 3 }}
* <code><nowiki>{{#invoke:String|sublength|s= abcdefghi |i= 3 |len= 4 }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi |i= 3 |len= 4 }}
== match ==
This function returns a substring from the source string that matches a specified pattern.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|match|''source_string''|''pattern_string''|''start_index''|''match_number''|''plain_flag''|''nomatch_output''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|match|s= ''source_string'' |pattern= ''pattern_string'' |start= ''start_index'' |match= ''match_number'' |plain= ''plain_flag'' |nomatch= ''nomatch_output'' }}</code>
Parameters:
; s
: The string to search
; pattern
: The pattern or string to find within the string
; start
: The index within the source string to start the search. The first character of the string has index 1. Defaults to 1.
; match
: In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1.
; plain
: Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]). Defaults to false (to change: <code>plain=true</code>)
; nomatch
: If no match is found, output the "nomatch" value rather than an error.
; ignore_errors
: If no match is found and ignore_errors=true, output an empty string rather than an error.
If the match_number or start_index are out of range for the string being queried, then this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and an empty string will be returned on any failure.
For information on constructing [[w:en:Lua (programming language)|Lua]] patterns, a form of [[w:en:regular expression|regular expression]], see:
* [[mw:Special:MyLanguage/Extension:Scribunto/Lua_reference_manual#Patterns|Scribunto patterns]]
* [[mw:Special:MyLanguage/Extension:Scribunto/Lua_reference_manual#Ustring_patterns|Scribunto Unicode string patterns]]
Examples:
* <code><nowiki>{{#invoke:String|match| abc123def456 |%d+}}</nowiki></code> → {{#invoke:String|match| abc123def456 |%d+}}
* <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ }}
* <code><nowiki>{{#invoke:String|match| abc123def456 |%d+|6}}</nowiki></code> → {{#invoke:String|match| abc123def456 |%d+|6}}
* <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 }}
* <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 |match= 2 }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 |match= 2 }}
* <code><nowiki>{{#invoke:String|match|s= abc123%d+ |pattern= %d+ }}</nowiki></code> → {{#invoke:String|match|s= abc123%d+ |pattern= %d+ }}
* <code><nowiki>{{#invoke:String|match|s= abc123%d+ |pattern= %d+ |plain= true }}</nowiki></code> → {{#invoke:String|match|s= abc123%d+ |pattern= %d+ |plain= true }}
* <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |no_category=true}}
* <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d |nomatch= No numeric characters in string }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |nomatch= No numeric characters in string }}
* <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d |ignore_errors= true }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |ignore_errors= true }}
* <code><nowiki>{{#invoke:String|match|s= 0012001200 |pattern= 0*(%d*) }}</nowiki></code> → {{#invoke:String|match|s= 0012001200 |pattern= 0*(%d*) }}
== pos ==
This function returns a single character from the target string at position pos.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|pos|''target_string''|''index_value''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|pos|target= ''target_string'' |pos= ''index_value'' }}</code>
Parameters:
; target
: The string to search
; pos
: The index for the character to return
The first character has an index value of 1.
If one requests a negative value, this function will select a character by counting backwards
from the end of the string. In other words pos = -1 is the same as asking for the last character.
A requested value of zero, or a value greater than the length of the string returns an error.
Examples:
* <code><nowiki>{{#invoke:String|pos| abcdefghi | 4 }}</nowiki></code> → {{#invoke:String|pos| abcdefghi | 4 }}
* <code><nowiki>{{#invoke:String|pos|target= abcdefghi |pos= 4 }}</nowiki></code> → {{#invoke:String|pos|target= abcdefghi |pos= 4 }}
== str_find ==
This function duplicates the behavior of {{tl|str_find}}, including all of its quirks. This is provided in order to support existing templates, but is NOT RECOMMENDED for new code and templates. New code is recommended to use the "find" function instead.
Returns the first index in "source" that is a match to "target". Indexing is 1-based, and the function returns -1 if the "target" string is not present in "source".
Important Note: If the "target" string is empty / missing, this function returns a value of "1", which is generally unexpected behavior, and must be accounted for separately.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|str_find|''source_string''|''target_string''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|str_find|source= ''source_string'' |target= ''target_string'' }}</code>
Parameters:
; source
: The string to search
; target
: The string to find within source
Examples:
* <code><nowiki>{{#invoke:String|str_find| abc123def }}</nowiki></code> → {{#invoke:String|str_find| abc123def }}
* <code><nowiki>{{#invoke:String|str_find|source= abc123def }}</nowiki></code> → {{#invoke:String|str_find|source= abc123def }}
* <code><nowiki>{{#invoke:String|str_find| abc123def |123}}</nowiki></code> → {{#invoke:String|str_find| abc123def |123}}
* <code><nowiki>{{#invoke:String|str_find|source= abc123def |target= 123 }}</nowiki></code> → {{#invoke:String|str_find|source= abc123def |target= 123 }}
* <code><nowiki>{{#invoke:String|str_find| abc123def |not}}</nowiki></code> → {{#invoke:String|str_find| abc123def |not}}
== find ==
This function allows one to search for a target string or pattern within another string.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|find|''source_string''|''target_string''|''start_index''|''plain_flag''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|find|source= ''source_string'' |target= ''target_string'' |start= ''start_index'' |plain= ''plain_flag'' }}</code>
Parameters:
; source
: The string to search
; target
: The string or pattern to find within source
; start
: The index within the source string to start the search, defaults to 1
; plain
: Boolean flag indicating that target should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true
This function returns the first index >= "start" where "target" can be found within "source". Indices are 1-based. If "target" is not found, then this function returns 0. If either "source" or "target" are missing / empty, this function also returns 0.
This function should be safe for UTF-8 strings.
Examples:
* <code><nowiki>{{#invoke:String|find|abc123def|12}}</nowiki></code> → {{#invoke:String|find|abc123def|12}}
* <code><nowiki>{{#invoke:String|find|source=abc123def|target=12}}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=12}}
* <code><nowiki>{{#invoke:String|find|source=abc123def|target=pqr}}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=pqr}}
* <code><nowiki>{{#invoke:String|find| abc123def |123}}</nowiki></code> → {{#invoke:String|find| abc123def |123}}
* <code><nowiki>{{#invoke:String|find|source= abc123def |target= 123 }}</nowiki></code> → {{#invoke:String|find|source= abc123def |target= 123 }}
* <code><nowiki>{{#invoke:String|find|source=abc123def|target=%d |start=3 |plain=false }}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=%d |start=3 |plain=false }}
When using unnamed parameters, preceding and trailing spaces are kept and counted:
* <code><nowiki>{{#invoke:String|find| abc123def |c|false}}</nowiki></code> → {{#invoke:String|find| abc123def |c|false}}
* <code><nowiki>{{#invoke:String|find|source= abc123def |target=c|plain=false}}</nowiki></code> → {{#invoke:String|find|source= abc123def |target=c|plain=false}}
* <code><nowiki>{{#invoke:string|find|abc 123 def|%s|plain=false}}</nowiki></code> → {{#invoke:string|find|abc 123 def|%s|plain=false}}
Testing for the presence of a string:
* <code>{{pf|ifexpr|<nowiki>{{#invoke:string|find|haystack|needle}}</nowiki>|Found needle|Didn't find needle}}</code> → {{#ifexpr:{{#invoke:string|find|haystack|needle}}|Found needle|Didn't find needle}}
{{anchor|replace}}
== replace (gsub) ==
This function allows one to replace a target string or pattern within another string. To Lua programmers: this function works internally by calling <code>[[mw:Extension:Scribunto/Lua_reference_manual#mw.ustring.gsub|mw.ustring.gsub]]</code>.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|replace|''source_str''|''pattern_string''|''replace_string''|''replacement_count''|''plain_flag''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|replace|source= ''source_string'' |pattern= ''pattern_string'' |replace= ''replace_string'' |count= ''replacement_count'' |plain= ''plain_flag'' }}</code>
Parameters:
; source
: The string to search
; pattern
: The string or pattern to find within source
; replace
: The replacement text
; count
: The number of occurrences to replace; defaults to all
; plain
: Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true
Examples:
* <code><nowiki>"{{#invoke:String|replace| abc123def456 |123|XYZ}}"</nowiki></code> → "{{#invoke:String|replace| abc123def456 |123|XYZ}}"
* <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= 123 |replace= XYZ }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= 123 |replace= XYZ }}"
* <code><nowiki>"{{#invoke:String|replace| abc123def456 |%d+|XYZ|1|false}}"</nowiki></code> → "{{#invoke:String|replace| abc123def456 |%d+|XYZ|1|false}}"
* <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |count=1 |plain= false }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |count=1 |plain= false }}"
* <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |plain= false }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |plain= false }}"
* <code><nowiki>{{#invoke:String|replace|source= 0012001200 |pattern= ^0* |plain= false }}</nowiki></code> → {{#invoke:String|replace|source= 0012001200 |pattern= ^0* |plain= false }}
== rep ==
Repeats a string ''n'' times. A simple function to pipe string.rep to templates.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|rep|''source''|''count''}}</code>
Parameters:
; source
: The string to repeat
; count
: The number of repetitions.
Examples:
* <code><nowiki>"{{#invoke:String|rep|hello|3}}"</nowiki></code> → "{{#invoke:String|rep|hello|3}}"
* <code><nowiki>"{{#invoke:String|rep| hello | 3 }}"</nowiki></code> → "{{#invoke:String|rep| hello | 3 }}"
== escapePattern ==
In a [[:mw:LUAREF#Patterns|Lua pattern]], changes a ''class character'' into a ''literal character''. For example: in a pattern, character <code>.</code> catches "any character"; escapePattern will convert it to <code>%.</code>, catching just the literal character ".".
Usage:
* <code><nowiki>{{#invoke:String|escapePattern|</nowiki>''pattern_string''<nowiki>}}</nowiki></code>
Parameters:
; pattern_string
: The pattern string to escape
Examples:
* <code><nowiki>"{{#invoke:String|escapePattern|A.D.}}"</nowiki></code> → "{{#invoke:String|escapePattern|A.D.}}"
* <code><nowiki>"{{#invoke:String|escapePattern|10%}}"</nowiki></code> → "{{#invoke:String|escapePattern|10%}}"
== count ==
Counts the number of times a given pattern appears in the arguments that get passed on to this module. Counts disjoint matches only.
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|count|''source_str''|''pattern_string''|''plain_flag''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|count|source= ''source_string'' |pattern= ''pattern_string''|plain= ''plain_flag'' }}</code>
Parameters:
; source_string
: The string to count occurrences in
; pattern
: The string or pattern to count occurrences of within source
; plain
: Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true
Examples:
* Count of 'a': <code><nowiki>"{{#invoke:String|count|aabbcc|a}}"</nowiki></code> → "{{#invoke:String|count|aabbcc|a}}"
* Count occurrences of 'aba': <code><nowiki>"{{#invoke:String|count|ababababab|aba}}"</nowiki></code> → "{{#invoke:String|count|ababababab|aba}}"
* Count of "either 'a' or 'c' ":<code><nowiki>"{{#invoke:String|count|aabbcc|[ac]|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aabbcc|[ac]|plain=false}}"
* Count of "not 'a' ": <code><nowiki>"{{#invoke:String|count|aaabaaac|[^a]|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aaabaaac|[^a]|plain=false}}"
* Count of "starts with 'a' ": <code><nowiki>"{{#invoke:String|count|aaabaaac|^a|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aaabaaac|^a|plain=false}}"
== join ==
Joins all strings passed as arguments into one string, treating the first argument as a separator
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|join|''separator''|''string1''|''string2''|...}}</code>
Parameters:
; separator
: String that separates each string being joined together
: Note that leading and trailing spaces are ''not'' stripped from the separator.
; string1/string2/...
: Strings being joined together
Examples:
* <code><nowiki>"{{#invoke:String|join|x|foo|bar|baz}}"</nowiki></code> → "{{#invoke:String|join|x|foo|bar|baz}}"
* <code><nowiki>"{{#invoke:String|join||a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join||a|b|c|d|e|f|g}}"
* <code><nowiki>"{{#invoke:String|join|,|a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join|,|a|b|c|d|e|f|g}}"
* <code><nowiki>"{{#invoke:String|join|, |a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join|, |a|b|c|d|e|f|g}}"
* <code><nowiki>"{{#invoke:String|join| – |a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join| – |a|b|c|d|e|f|g}}"
The preceding example uses the html entity &ndash; but the unicode character also works.
== endswith ==
{{for|the startswith function|Module:String2#startswith}}
Usage:
: <code><nowiki>{{#invoke:</nowiki>String|endswith|''source_str''|''search_string''}}</code>
OR
: <code><nowiki>{{#invoke:</nowiki>String|endswith|source= ''source_string'' |pattern= ''search_string''}}</code>
Returns "yes" if the source string ends with the search string. Use named parameters to have the strings trimmed before use. Despite the parameter name, ''search_string'' is not a Lua pattern, it is interpreted literally.
* <code><nowiki>"{{#invoke:String|endswith|xxxyyy|y}}"</nowiki></code> → "{{#invoke:String|endswith|xxxyyy|y}}"
* <code><nowiki>"{{#invoke:String|endswith|xxxyyy|z}}"</nowiki></code> → "{{#invoke:String|endswith|xxxyyy|z}}"
== See also==
{{String handling templates}}
<includeonly>{{Sandbox other||
[[Category:Modules that add a tracking category]]
[[Category:Modules that manipulate strings|*]]
}}</includeonly>
b69276b177d017dfb1f4f18e684ddce742d0a8b9
Module:Clickable button 2
828
68
84
2023-10-07T17:07:16Z
Silentg
2
Created page with "-- This module implements {{clickable button 2}}. local yesno = require('Module:Yesno') local p = {} local function rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args) if yesno(args.category) == false then return '' end -- we have no tracking categories currently but args.category should be -- supported into the future, so just return a string here for now return '' end local function makeLinkData(args) local data = {} -- Get the link and display values, -- and fin..."
Scribunto
text/plain
-- This module implements {{clickable button 2}}.
local yesno = require('Module:Yesno')
local p = {}
local function rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args)
if yesno(args.category) == false then
return ''
end
-- we have no tracking categories currently but args.category should be
-- supported into the future, so just return a string here for now
return ''
end
local function makeLinkData(args)
local data = {}
-- Get the link and display values,
-- and find whether we are outputting
-- a wikilink or a URL.
if args.url then
data.isUrl = true
data.link = args.url
if args[1] then
data.display = args[1]
else if args[2] then
data.display = args[2]
else
data.display = args.url
p.urlisdisplay = true
end
end
else
data.isUrl = false
p.urlisdisplay = false
data.link = args[1]
if args[2] then
data.display = args[2]
else
data.display = args[1]
end
end
if yesno(args.link) == false then
p.nolink = true
end
-- Colours
-- For the merge with {{clickable button}}
local colour = args.color and args.color:lower()
-- Classes
local class = args.class and args.class:lower()
data.classes = {}
if class == 'ui-button-green'
or class == 'ui-button-blue'
or class == 'ui-button-red'
then
table.insert(
data.classes,
'submit ui-button ui-widget ui-state-default ui-corner-all'
.. ' ui-button-text-only ui-button-text'
)
else
table.insert(data.classes, 'mw-ui-button')
end
--If class is unset,
--then let color determine class
if not class then
if colour == 'blue' then
class = 'mw-ui-progressive'
else if colour == 'red' then
class = 'mw-ui-destructive'
else if colour == 'green' then
class = 'mw-ui-constructive'
end
end
end
end
if class then
table.insert(data.classes, class)
end
-- Styles
do
--[[
-- Check whether we are on the same page as we have specified in
-- args[1], but not if we are using a URL link, as then args[1] is only
-- a display value. If we are currently on the page specified in
-- args[1] make the button colour darker so that it stands out from
-- other buttons on the page.
--]]
local success, linkTitle, currentTitle
if not data.isUrl then
currentTitle = mw.title.getCurrentTitle()
success, linkTitle = pcall(mw.title.new, args[1])
elseif p.urlisdisplay then
currentTitle = mw.title.getCurrentTitle()
end
if success
and linkTitle
and mw.title.equals(currentTitle, linkTitle)
and not p.urlisdisplay
then
if class == 'ui-button-blue'
or class == 'mw-ui-progressive'
or class == 'mw-ui-constructive'
then
data.backgroundColor = '#2962CB'
data.color = '#fff'
elseif class == 'ui-button-green' then
data.backgroundColor = '#008B6D'
elseif class == 'ui-button-red' or class == 'mw-ui-destructive' then
data.backgroundColor = '#A6170F'
else
data.backgroundColor = '#CCC'
data.color = '#666'
end
else
if p.urlisdisplay
then
data.dummyLink = tostring(currentTitle)
end
end
-- Add user-specified styles.
data.style = args.style
end
return data
end
local function renderLink(data)
-- Render the display span tag.
local display
do
local displaySpan = mw.html.create('span')
for i, class in ipairs(data.classes or {}) do
displaySpan:addClass(class)
end
displaySpan
:css{
['background-color'] = data.backgroundColor,
color = data.color
}
if data.style then
displaySpan:cssText(data.style)
end
displaySpan:wikitext(data.display)
display = tostring(displaySpan)
end
-- Render the link
local link
if p.nolink then
if p.urlisdisplay then
link = string.format('[[%s|%s]]', data.dummyLink, display)
else
link = string.format('%s', display)
end
else if data.isUrl then
link = string.format('[%s %s]', data.link, display)
else
link = string.format('[[%s|%s]]', data.link, display)
end
end
return string.format('<span class="plainlinks clickbutton">%s</span>', link)
end
function p.luaMain(args)
-- If first arg or a url is not provided,
-- but we have a second arg, make a button.
-- Otherwise, return nothing.
if not args[1] and not args.url then
if args[2] then
p.nolink = true
else
return ''
end
end
local data = makeLinkData(args)
local link = renderLink(data)
local trackingCategories = rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args)
return link .. trackingCategories
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Clickable button 2'
})
return p.luaMain(args)
end
return p
aecb758a361b684291d221c7de4da78d017660da
Module:Clickable button 2/doc
828
69
85
2023-10-07T17:07:40Z
Silentg
2
Created page with "{{Module rating|protected}} {{Used in system}} {{Lua|Module:Yesno|Module:Arguments}} This module implements the {{Template link|Clickable button 2}} template. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Clickable button 2}} template. However, it can also be used with the syntax <code><nowiki>{{#invoke:Clickable button 2|main|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the template page for a list o..."
wikitext
text/x-wiki
{{Module rating|protected}}
{{Used in system}}
{{Lua|Module:Yesno|Module:Arguments}}
This module implements the {{Template link|Clickable button 2}} template.
== Usage from wikitext ==
To use this module from wikitext, you should normally use the {{Template link|Clickable button 2}} template. However, it can also be used with the syntax <code><nowiki>{{#invoke:Clickable button 2|main|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the template page for a list of available parameters.
== Usage from Lua modules ==
To use this module from other Lua modules, first load the module.
<syntaxhighlight lang="lua">
local mClickableButton2 = require('Module:Clickable button 2')
</syntaxhighlight>
You can then generate a button using the luaMain function.
<syntaxhighlight lang="lua">
mClickableButton2.luaMain(args)
</syntaxhighlight>
The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the {{Template link|Clickable button 2}} template documentation.
<includeonly>{{Sandbox other||
<!-- Categories go here and interwikis go in Wikidata. -->
}}</includeonly>
ff29bbfd2423b85cfc0d1d1a3db22fe44920b28a
Module:Navbar
828
70
86
2023-10-08T04:54:06Z
Silentg
2
Created page with "local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false..."
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
79f907e59eaa8bbf8dd50bb751933ebeaaa7eb17
Module:Navbar/doc
828
71
87
2023-10-08T04:54:57Z
Silentg
2
Created page with "{{used in system}} {{module rating|protected}} {{Lua|Module:Navbar/configuration|Module:Arguments|Module:TableTools}} {{Uses TemplateStyles|Module:Navbar/styles.css|Template:Hlist/styles.css}} This is a [[WP:Lua|Lua]] implementation of {{tl|Navbar}}. It is used in [[Module:Navbox]]."
wikitext
text/x-wiki
{{used in system}}
{{module rating|protected}}
{{Lua|Module:Navbar/configuration|Module:Arguments|Module:TableTools}}
{{Uses TemplateStyles|Module:Navbar/styles.css|Template:Hlist/styles.css}}
This is a [[WP:Lua|Lua]] implementation of {{tl|Navbar}}. It is used in [[Module:Navbox]].
8525efb014e023829e4454a637299cf4a8cd958b
Module:Navbar/configuration
828
72
88
2023-10-08T04:55:51Z
Silentg
2
Created page with "return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Hlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal lis..."
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['hlist_templatestyles'] = 'Hlist/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
b007c336b17ec4bcd4d5a9dca9f8cba301662b55
Module:Navbar/configuration/doc
828
73
89
2023-10-08T04:56:11Z
Silentg
2
Created page with "{{module rating|protected}} {{used in system}} Configuration used by [[Module:Navbar]]."
wikitext
text/x-wiki
{{module rating|protected}}
{{used in system}}
Configuration used by [[Module:Navbar]].
87cf99c13d46ff840ea95b1bcfe9816b9fb8b9b8
Module:Navbar/styles.css
828
74
90
2023-10-08T04:57:27Z
Silentg
2
Created page with "/* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .nav..."
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
9d4056f949b4f0b159e3d40dfb1a5f01e72f9571
Template:Hlist/styles.css
10
75
91
2023-10-08T04:58:22Z
Silentg
2
Created page with "/* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or s..."
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Module:Italic title
828
76
92
2023-10-08T05:00:18Z
Silentg
2
Created page with "-- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ----------------..."
Scribunto
text/plain
-- This module implements {{italic title}}.
require('strict')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
-- ItalicTitle class
--------------------------------------------------------------------------------
local ItalicTitle = {}
do
----------------------------------------------------------------------------
-- Class attributes and functions
-- Things that belong to the class are here. Things that belong to each
-- object are in the constructor.
----------------------------------------------------------------------------
-- Keys of title parts that can be italicized.
local italicizableKeys = {
namespace = true,
title = true,
dab = true,
}
----------------------------------------------------------------------------
-- ItalicTitle constructor
-- This contains all the dynamic attributes and methods.
----------------------------------------------------------------------------
function ItalicTitle.new()
local obj = {}
-- Function for checking self variable in methods.
local checkSelf = libraryUtil.makeCheckSelfFunction(
'ItalicTitle',
'obj',
obj,
'ItalicTitle object'
)
-- Checks a key is present in a lookup table.
-- Param: name - the function name.
-- Param: argId - integer position of the key in the argument list.
-- Param: key - the key.
-- Param: lookupTable - the table to look the key up in.
local function checkKey(name, argId, key, lookupTable)
if not lookupTable[key] then
error(string.format(
"bad argument #%d to '%s' ('%s' is not a valid key)",
argId,
name,
key
), 3)
end
end
-- Set up object structure.
local parsed = false
local categories = {}
local italicizedKeys = {}
local italicizedSubstrings = {}
-- Parses a title object into its namespace text, title, and
-- disambiguation text.
-- Param: options - a table of options with the following keys:
-- title - the title object to parse
-- ignoreDab - ignore any disambiguation parentheses
-- Returns the current object.
function obj:parseTitle(options)
checkSelf(self, 'parseTitle')
checkType('parseTitle', 1, options, 'table')
checkTypeForNamedArg('parseTitle', 'title', options.title, 'table')
local title = options.title
-- Title and dab text
local prefix, parentheses
if not options.ignoreDab then
prefix, parentheses = mw.ustring.match(
title.text,
'^(.+) %(([^%(%)]+)%)$'
)
end
if prefix and parentheses then
self.title = prefix
self.dab = parentheses
else
self.title = title.text
end
-- Namespace
local namespace = mw.site.namespaces[title.namespace].name
if namespace and #namespace >= 1 then
self.namespace = namespace
end
-- Register the object as having parsed a title.
parsed = true
return self
end
-- Italicizes part of the title.
-- Param: key - the key of the title part to be italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:italicize(key)
checkSelf(self, 'italicize')
checkType('italicize', 1, key, 'string')
checkKey('italicize', 1, key, italicizableKeys)
italicizedKeys[key] = true
return self
end
-- Un-italicizes part of the title.
-- Param: key - the key of the title part to be un-italicized. Possible
-- keys are contained in the italicizableKeys table.
-- Returns the current object.
function obj:unitalicize(key)
checkSelf(self, 'unitalicize')
checkType('unitalicize', 1, key, 'string')
checkKey('unitalicize', 1, key, italicizableKeys)
italicizedKeys[key] = nil
return self
end
-- Italicizes a substring in the title. This only affects the main part
-- of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be italicized.
-- Returns the current object.
function obj:italicizeSubstring(s)
checkSelf(self, 'italicizeSubstring')
checkType('italicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = true
return self
end
-- Un-italicizes a substring in the title. This only affects the main
-- part of the title, not the namespace or the disambiguation text.
-- Param: s - the substring to be un-italicized.
-- Returns the current object.
function obj:unitalicizeSubstring(s)
checkSelf(self, 'unitalicizeSubstring')
checkType('unitalicizeSubstring', 1, s, 'string')
italicizedSubstrings[s] = nil
return self
end
-- Renders the object into a page name. If no title has yet been parsed,
-- the current title is used.
-- Returns string
function obj:renderTitle()
checkSelf(self, 'renderTitle')
-- Italicizes a string
-- Param: s - the string to italicize
-- Returns string.
local function italicize(s)
assert(type(s) == 'string', 's was not a string')
assert(s ~= '', 's was the empty string')
return string.format('<i>%s</i>', s)
end
-- Escape characters in a string that are magic in Lua patterns.
-- Param: pattern - the pattern to escape
-- Returns string.
local function escapeMagicCharacters(s)
assert(type(s) == 'string', 's was not a string')
return s:gsub('%p', '%%%0')
end
-- If a title hasn't been parsed yet, parse the current title.
if not parsed then
self:parseTitle{title = mw.title.getCurrentTitle()}
end
-- Italicize the different parts of the title and store them in a
-- titleParts table to be joined together later.
local titleParts = {}
-- Italicize the italicizable keys.
for key in pairs(italicizableKeys) do
if self[key] then
if italicizedKeys[key] then
titleParts[key] = italicize(self[key])
else
titleParts[key] = self[key]
end
end
end
-- Italicize substrings. If there are any substrings to be
-- italicized then start from the raw title, as this overrides any
-- italicization of the main part of the title.
if next(italicizedSubstrings) then
titleParts.title = self.title
for s in pairs(italicizedSubstrings) do
local pattern = escapeMagicCharacters(s)
local italicizedTitle, nReplacements = titleParts.title:gsub(
pattern,
italicize
)
titleParts.title = italicizedTitle
-- If we didn't make any replacements then it means that we
-- have been passed a bad substring or that the page has
-- been moved to a bad title, so add a tracking category.
if nReplacements < 1 then
categories['Pages using italic title with no matching string'] = true
end
end
end
-- Assemble the title together from the parts.
local ret = ''
if titleParts.namespace then
ret = ret .. titleParts.namespace .. ':'
end
ret = ret .. titleParts.title
if titleParts.dab then
ret = ret .. ' (' .. titleParts.dab .. ')'
end
return ret
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments.
-- Returns string
function obj:renderDisplayTitle(...)
checkSelf(self, 'renderDisplayTitle')
return mw.getCurrentFrame():callParserFunction(
'DISPLAYTITLE',
self:renderTitle(),
...
)
end
-- Returns an expanded DISPLAYTITLE parser function called with the
-- result of obj:renderTitle, plus any other optional arguments, plus
-- any tracking categories.
-- Returns string
function obj:render(...)
checkSelf(self, 'render')
local ret = self:renderDisplayTitle(...)
for cat in pairs(categories) do
ret = ret .. string.format(
'[[Category:%s]]',
cat
)
end
return ret
end
return obj
end
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
local function getArgs(frame, wrapper)
assert(type(wrapper) == 'string', 'wrapper was not a string')
return require('Module:Arguments').getArgs(frame, {
wrappers = wrapper
})
end
-- Main function for {{italic title}}
function p._main(args)
checkType('_main', 1, args, 'table')
local italicTitle = ItalicTitle.new()
italicTitle:parseTitle{
title = mw.title.getCurrentTitle(),
ignoreDab = yesno(args.all, false)
}
if args.string then
italicTitle:italicizeSubstring(args.string)
else
italicTitle:italicize('title')
end
return italicTitle:render(args[1])
end
function p.main(frame)
return p._main(getArgs(frame, 'Template:Italic title'))
end
function p._dabonly(args)
return ItalicTitle.new()
:italicize('dab')
:render(args[1])
end
function p.dabonly(frame)
return p._dabonly(getArgs(frame, 'Template:Italic dab'))
end
return p
9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8
Module:Italic title/doc
828
77
93
2023-10-08T05:00:45Z
Silentg
2
Created page with "{{High-risk| approximately 844000 }} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module implements {{tl|italic title}} and {{tl|italic dab}}. Please see the template pages for documentation."
wikitext
text/x-wiki
{{High-risk| approximately 844000 }}
{{module rating|protected}}
{{Lua|Module:Yesno|Module:Arguments}}
This module implements {{tl|italic title}} and {{tl|italic dab}}. Please see the template pages for documentation.
5dea766bbc5c3c2d91e2b8df9e54d506aef23b35
Template:Plainlist/styles.css
10
78
94
2023-10-08T05:01:23Z
Silentg
2
Created page with "/* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; }"
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
51706efa229ff8794c0d94f260a208e7c5e6ec30
Template:Infobox/doc
10
79
95
2023-10-08T05:02:02Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{distinguish|Template:Userbox}} {{#ifeq:{{SUBPAGENAME}}|sandbox||{{High-use}}}} {{Lua|Module:Infobox}} {{Parameter names example |name={{PAGENAME}} <!--|child |subbox |decat--> |title |above |subheader |subheader1 |subheader2={{{subheader2}}}<br/>...... |image|caption |image1|caption1 |image2|caption2={{{caption2..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{distinguish|Template:Userbox}}
{{#ifeq:{{SUBPAGENAME}}|sandbox||{{High-use}}}}
{{Lua|Module:Infobox}}
{{Parameter names example
|name={{PAGENAME}} <!--|child |subbox |decat--> |title |above |subheader |subheader1 |subheader2={{{subheader2}}}<br/>......
|image|caption |image1|caption1 |image2|caption2={{{caption2}}}<br/>......
|header1=<div style="border-top:1px dashed #ccc;">{{{header1}}}<br/>{{nobold|( ''or'' )}}</div>
|label2={{{label1}}} |data2={{{data1}}}
|data3=( ''or'' ) |data4=<div style="padding-bottom:0.25em;border-bottom:1px dashed #ccc;">{{{data1}}}</div>
|header5={{{header2}}}<br/><div style="padding:0.75em 0 0.5em;">{{nobold|( ''or'' )}}</div>
|label6={{{label2}}} |data6={{{data2}}}
|data7=( ''or'' ) |data8=<div style="padding-bottom:0.25em;border-bottom:1px dashed #ccc;">{{{data2}}}</div>
|data9=<div style="padding:0.75em 0 0.5em;">( ''etc'' )</div>
|below
}}
This template is intended as a meta template: a template used for constructing other templates. '''Note''': In general, it is not meant for use directly in an article, but can be used on a one-off basis if required. [[Help:Infobox]] contains an introduction about the recommended content and design of infoboxes; [[Wikipedia:Manual of Style/Infoboxes]] contains additional style guidelines. See [[WP:List of infoboxes]] and [[:Category:Infobox templates]] for lists of prepared topic-specific infoboxes.
== Usage ==
{{tlf|Infobox}} is a meta-template: used to organise an actual <nowiki>{{Infobox sometopic}}</nowiki> template (like {{tl|Infobox building}}).
For <code><nowiki>[[Template:Infobox sometopic]]</nowiki></code>, template code then looks like this, simplified:
<syntaxhighlight lang="wikitext">
{{Infobox
| name = {{{name|{{PAGENAME}}}}}
| image = {{{image|}}}
| caption1 = {{{caption|}}}
| label1 = Former names
| data1 = {{{former_names|}}}
| header2 = General information
| label3 = Status
| data3 = {{{status|}}}
... <!-- etc. -->
}}
</syntaxhighlight>
== Optional control parameters ==
; name : If this parameter is present, "view/talk/edit" links will be added to the bottom of the infobox pointing to the named page, prefixed by <code>Template:</code> if no namespace is specified. You may use the value <nowiki>{{subst:PAGENAME}}</nowiki>; however, this is rarely what you want because it will send users clicking these links in an infobox to the template code rather than the data in the infobox they probably want to change.
; child : See the [[#Embedding|Embedding]] section for details. If this is set to "yes", this child infobox should be titled but have no name parameter. This parameter is empty by default, set it to "yes" to activate it.
; subbox : See the [[#Subboxes|Subboxes]] section for details. If this is set to "yes", this subbox should be titled but have no name parameter. This parameter is empty by default, set to "yes" to activate it. It has no effect if the '''child''' parameter is also set to "yes".
; decat : If this is set to "yes", the current page will not be autocategorized in a maintenance category when the generated infobox has some problems or no visible data section. Leave empty by default or set to "yes" to activate it.
; autoheaders: If this is set to any non-blank value, headers which are not followed by data fields are suppressed. See the "[[#Hiding headers when all its data fields are empty|hiding headers when all its data fields are empty]]" section for more details.
== Content parameters ==
=== Title ===
There are two different ways to put a title on an infobox. One contains the title inside the infobox's border in the uppermost cell of the table, the other puts it as a caption on top of the table. You can use them both together, or just one or the other, or neither (though this is not recommended):
; title : Text to put in the caption over the top of the table (or as section header before the whole content of this table, if this is a child infobox). For [[Wikipedia:Manual of Style/Accessibility#Tables|accessibility reasons]], this is the most recommended alternative.
; above : Text to put within the uppermost cell of the table.
; subheader(n) : additional title fields which fit below {{{title}}} and {{{above}}}, but before images.
Examples:
{{Infobox
| name = Infobox/doc
| title = Text in caption over infobox
| subheader = Subheader of the infobox
| header = (the rest of the infobox goes here)
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| name = {{subst:PAGENAME}}
| title = Text in caption over infobox
| subheader = Subheader of the infobox
| header = (the rest of the infobox goes here)
}}
</syntaxhighlight>{{clear}}
{{Infobox
| name = Infobox/doc
| above = Text in uppermost cell of infobox
| subheader = Subheader of the infobox
| subheader2 = Second subheader of the infobox
| header = (the rest of the infobox goes here)
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| name = {{subst:PAGENAME}}
| above = Text in uppermost cell of infobox
| subheader = Subheader of the infobox
| subheader2 = Second subheader of the infobox
| header = (the rest of the infobox goes here)
}}
</syntaxhighlight>{{clear}}
=== Illustration images ===
; image(n) : images to display at the top of the template. Use full image syntax, for example <nowiki>[[File:example.png|200px|alt=Example alt text]]</nowiki>. Image is centered by default. See [[WP:ALT]] for more on alt text.
; caption(n) : Text to put underneath the images.
=== Main data ===
; header(n) : Text to use as a header in row n.
; label(n) : Text to use as a label in row n.
; data(n) : Text to display as data in row n.
Note: for any given value for (n), not all combinations of parameters are permitted. The presence of a {{para|header''(n)''}} will cause the corresponding {{para|data''(n)''}} (and {{para|rowclass''(n)''}} {{para|label''(n)''}}, see below) to be ignored; the absence of a {{para|data''(n)''}} will cause the corresponding {{para|label''(n)''}} to be ignored. Valid combinations for any single row are:
* {{para|class''(n)''}} {{para|header''(n)''}}
* {{para|rowclass''(n)''}} {{para|class''(n)''}} {{para|data''(n)''}}
* {{para|rowclass''(n)''}} {{para|label''(n)''}} {{para|class''(n)''}} {{para|data''(n)''}}
See the rendering of header4, label4, and data4 in the [[#Examples|Examples]] section below.
==== Number ranges ====
To allow flexibility when the layout of an infobox is changed, it may be helpful when developing an infobox to use non-contiguous numbers for header and label/data rows. Parameters for new rows can then be inserted in future without having to renumber existing parameters. For example:
<syntaxhighlight lang="wikitext" style="overflow:auto">
| header3 = Section 1
| label5 = Label A
| data5 = Data A
| label7 = Label C
| data7 = Data C
| header10 = Section 2
| label12 = Label D
| data12 = Data D
</syntaxhighlight>{{clear}}
It is also possible to automatically renumber parameter names by using [[User:Frietjes/infoboxgap.js]] or [[Module:IncrementParams]].
There is no upper limit on numbers but there must be at most 50 between each used number.
==== Making data fields optional ====
A row with a label but no data is not displayed. This allows for the easy creation of optional infobox content rows. To make a row optional use a parameter that defaults to an empty string, like so:
<syntaxhighlight lang="wikitext" style="overflow:auto">
| label5 = Population
| data5 = {{{population|}}}
</syntaxhighlight>{{clear}}
This way if an article doesn't define the population parameter in its infobox the row won't be displayed.
For more complex fields with pre-formatted contents that would still be present even if the parameter wasn't set, you can wrap it all in an "#if" statement to make the whole thing vanish when the parameter is not used. For instance, the "#if" statement in the following example reads "#if:the parameter ''mass'' has been supplied |then display it, followed by 'kg'":
<syntaxhighlight lang="wikitext" style="overflow:auto">
| label6 = Mass
| data6 = {{ #if: {{{mass|}}} | {{{mass}}} kg }}
</syntaxhighlight>{{clear}}
For more on #if, see [[meta:ParserFunctions##if:|here]].
==== Hiding headers when all its data fields are empty ====
You can also make headers automatically hide when their section is empty (has no data-row showing).
Consider this situation:
{{Infobox
| title = Example: header with & without data
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = Header5 with data below
| label6 = label6 text | data6 = Some value
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Example: header with & without data
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = Header5 with data below
| label6 = label6 text | data6 = Some value
}}
</syntaxhighlight>{{clear}}
If you want hide the header when no {{para|data''N''}} values are present, use '''{{para|autoheaders|y}}''':
{{Infobox
| title = Example: header with & without data
| autoheaders = y
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = Header5 with data below
| label6 = label6 text | data6 = Some value
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Example: header with & without data
| autoheaders = y
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = Header5 with data below
| label6 = label6 text | data6 = Some value
}}
</syntaxhighlight>{{clear}}
So, header1 will be shown if any of item1, item2, or item3 is defined. If none of the three parameters are defined the header won't be shown and no empty row appears before the next visible content.
Note: if the data has empty css elements, like {{para|data|2=<span style="background:yellow;"></span>}}, this will be treated as non-empty (having data).
If {{para|autoheaders|y}} but there are items that you ''do not'' want to trigger a header, place {{para|headerX|_BLANK_}}. This will serve as an empty header and separate it from the subsequent items.
{{Infobox
| title = Example: blank header with & without data
| autoheaders = y
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = _BLANK_
| label6 = label6 text | data6 = Some value, but does not trigger header1 or show header5
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Example: header with & without data
| autoheaders = y
| headerstyle = background:lightgrey
| header1 = Header1 with empty section
| label2 = label2 text | data2 =
| label3 = label3 text | data3 =
| label4 = label4 text | data4 =
| header5 = _BLANK_
| label6 = label6 text | data6 = Some value, but does not trigger header1 or show header5
}}
</syntaxhighlight>{{clear}}
=== Footer ===
; below : Text to put in the bottom cell. The bottom cell is intended for footnotes, see-also, and other such information.
== Presentation parameters ==
=== Italic titles ===
Titles of articles with infoboxes may be made italic, in line with [[WP:ITALICTITLE]], by passing the <code>italic title</code> parameter.
* Turn on italic titles by passing {{para|italic title|<nowiki>{{{italic title|}}}</nowiki>}} from the infobox.
* Turn off by default (notably because only Latin script may be safely rendered in this style and italic may be needed to distinguish foreign language from local English language only in that script, but would be difficult to read for other scripts) but allow some instances to be made italic by passing {{para|italic title|<nowiki>{{{italic title|no}}}</nowiki>}}
* Do not make any titles italic by not passing the parameter at all.
=== CSS styling ===
{{div col}}
; bodystyle : Applies to the infobox table as a whole
; titlestyle : Applies only to the title caption. Adding a background color is usually inadvisable since the text is rendered "outside" the infobox.
; abovestyle : Applies only to the "above" cell at the top. The default style has font-size:125%; since this cell is usually used for a title, if you want to use the above cell for regular-sized text include "font-size:100%;" in the abovestyle.
; imagestyle : Applies to the cell the image is in. This includes the text of the image caption, but you should set text properties with captionstyle instead of imagestyle in case the caption is moved out of this cell in the future.
; captionstyle : Applies to the text of the image caption.
; rowstyle(n) : This parameter is inserted into the <code>style</code> attribute for the specified row.
; headerstyle : Applies to all header cells
; subheaderstyle : Applies to all subheader cells
; labelstyle : Applies to all label cells
; datastyle : Applies to all data cells
; belowstyle : Applies only to the below cell
{{div col end}}
=== HTML classes and microformats ===
{{div col}}
; bodyclass : This parameter is inserted into the <code>class</code> attribute for the infobox as a whole.
; titleclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''title''' caption.
<!-- currently not implemented in Lua module
; aboverowclass : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''above''' cell is on.
-->
; aboveclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''above''' cell.
; subheaderrowclass(n) : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''subheader''' is on.
; subheaderclass(n) : This parameter is inserted into the <code>class</code> attribute for the infobox's '''subheader'''.
; imagerowclass(n) : These parameters are inserted into the <code>class</code> attribute for the complete table row their respective '''image''' is on.
; imageclass : This parameter is inserted into the <code>class</code> attribute for the '''image'''.
; rowclass(n) : This parameter is inserted into the <code>class</code> attribute for the specified row including the '''label''' and '''data''' cells.
; class(n) : This parameter is inserted into the <code>class</code> attribute for the '''data''' cell of the specified row. If there's no '''data''' cell it has no effect.
<!-- currently not implemented in Lua module
; belowrowclass : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''below''' cell is on.
-->
; belowclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''below''' cell.
{{div col end}}
This template supports the addition of microformat information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. Multiple class names may be specified, separated by spaces, some of them being used as selectors for custom styling according to a project policy or to the skin selected in user preferences, others being used for microformats.
To flag an infobox as containing [[hCard]] information, for example, add the following parameter:
<syntaxhighlight lang="wikitext" style="overflow:auto">
| bodyclass = vcard
</syntaxhighlight>{{clear}}
And for each row containing a data cell that's part of the vcard, add a corresponding class parameter:
<syntaxhighlight lang="wikitext" style="overflow:auto">
| class1 = fn
| class2 = org
| class3 = tel
</syntaxhighlight>{{clear}}
...and so forth. "above" and "title" can also be given classes, since these are usually used to display the name of the subject of the infobox.
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general.
== Examples ==
Notice how the row doesn't appear in the displayed infobox when a '''label''' is defined without an accompanying '''data''' cell, and how all of them are displayed when a '''header''' is defined on the same row as a '''data''' cell. Also notice that '''subheaders''' are not bold by default like the '''headers''' used to split the main data section, because this role is meant to be for the '''above''' cell :
{{Suppress categories|
{{Infobox
|name = Infobox/doc
|bodystyle =
|titlestyle =
|abovestyle = background:#cfc;
|subheaderstyle =
|title = Test Infobox
|above = Above text
|subheader = Subheader above image
|subheader2 = Second subheader
|imagestyle =
|captionstyle =
|image = [[File:Example-serious.jpg|200px|alt=Example alt text]]
|caption = Caption displayed below File:Example-serious.jpg
|headerstyle = background:#ccf;
|labelstyle = background:#ddf;
|datastyle =
|header1 = Header defined alone
| label1 =
| data1 =
|header2 =
| label2 = Label defined alone does not display (needs data, or is suppressed)
| data2 =
|header3 =
| label3 =
| data3 = Data defined alone
|header4 = All three defined (header, label, data, all with same number)
| label4 = does not display (same number as a header)
| data4 = does not display (same number as a header)
|header5 =
| label5 = Label and data defined (label)
| data5 = Label and data defined (data)
|belowstyle = background:#ddf;
|below = Below text
}}
}}
<syntaxhighlight lang="wikitext">
{{Infobox
|name = Infobox/doc
|bodystyle =
|titlestyle =
|abovestyle = background:#cfc;
|subheaderstyle =
|title = Test Infobox
|above = Above text
|subheader = Subheader above image
|subheader2 = Second subheader
|imagestyle =
|captionstyle =
|image = [[File:Example-serious.jpg|200px|alt=Example alt text]]
|caption = Caption displayed below File:Example-serious.jpg
|headerstyle = background:#ccf;
|labelstyle = background:#ddf;
|datastyle =
|header1 = Header defined alone
| label1 =
| data1 =
|header2 =
| label2 = Label defined alone does not display (needs data, or is suppressed)
| data2 =
|header3 =
| label3 =
| data3 = Data defined alone
|header4 = All three defined (header, label, data, all with same number)
| label4 = does not display (same number as a header)
| data4 = does not display (same number as a header)
|header5 =
| label5 = Label and data defined (label)
| data5 = Label and data defined (data)
|belowstyle = background:#ddf;
|below = Below text
}}
</syntaxhighlight>
For this example, the {{para|bodystyle}} and {{para|labelstyle}} parameters are used to adjust the infobox width and define a default width for the column of labels:
{{Infobox
|name = Infobox/doc
|bodystyle = width:20em
|titlestyle =
|title = Test Infobox
|headerstyle =
|labelstyle = width:33%
|datastyle =
|header1 =
| label1 = Label 1
| data1 = Data 1
|header2 =
| label2 = Label 2
| data2 = Data 2
|header3 =
| label3 = Label 3
| data3 = Data 3
|header4 = Header 4
| label4 =
| data4 =
|header5 =
| label5 = Label 5
| data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|belowstyle =
|below = Below text
}}
<syntaxhighlight lang="wikitext">
{{Infobox
|name = Infobox/doc
|bodystyle = width:20em
|titlestyle =
|title = Test Infobox
|headerstyle =
|labelstyle = width:33%
|datastyle =
|header1 =
| label1 = Label 1
| data1 = Data 1
|header2 =
| label2 = Label 2
| data2 = Data 2
|header3 =
| label3 = Label 3
| data3 = Data 3
|header4 = Header 4
| label4 =
| data4 =
|header5 =
| label5 = Label 5
| data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|belowstyle =
|below = Below text
}}
</syntaxhighlight>
== Embedding ==
<!--Linked from [[Template:Subinfobox bodystyle/doc]]-->
One infobox template can be embedded into another using the {{para|child}} parameter. This feature can be used to create a modular infobox, or to create better-defined logical sections. Long ago, it was necessary to use embedding in order to create infoboxes with more than 99 rows; but nowadays there's no limit to the number of rows that can be defined in a single instance of <code><nowiki>{{infobox}}</nowiki></code>.
{{Infobox
| title = Top level title
| data1 = {{Infobox | decat = yes | child = yes
| title = First subsection
| label1= Label 1.1
| data1 = Data 1.1
}}
| data2 = {{Infobox | decat = yes | child = yes
|title = Second subsection
| label1= Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Top level title
| data1 = {{Infobox | decat = yes | child = yes
| title = First subsection
| label1= Label 1.1
| data1 = Data 1.1
}}
| data2 = {{Infobox | decat = yes | child = yes
|title = Second subsection
| label1= Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
</syntaxhighlight>{{clear}}
Note, in the examples above, the child infobox is placed in a <code>data</code> field, not a <code>header</code> field. Notice that the section subheadings are not in bold font if bolding is not explicitly specified. To obtain bold section headings, place the child infobox in a '''header''' field (but not in a '''label''' field because it would not be displayed!), either using
{{Infobox
| title = Top level title
| header1 = {{Infobox | decat = yes | child = yes
| title = First subsection
| label1= Label 1.1
| data1 = Data 1.1
}}
| header2 = {{Infobox | decat = yes | child = yes
| title = Second subsection
| label1= Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Top level title
| header1 = {{Infobox | decat = yes | child = yes
| title = First subsection
| label1= Label 1.1
| data1 = Data 1.1
}}
| header2 = {{Infobox | decat = yes | child = yes
| title = Second subsection
| label1= Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
</syntaxhighlight>{{clear}}
or,
{{Infobox
| title = Top level title
| header1 = First subsection
{{Infobox | decat = yes | child = yes
| label1 = Label 1.1
| data1 = Data 1.1
}}
| header2 = Second subsection
{{Infobox | decat = yes | child = yes
| label1 = Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| title = Top level title
| header1 = First subsection
{{Infobox | decat = yes | child = yes
| label1 = Label 1.1
| data1 = Data 1.1
}}
| header2 = Second subsection
{{Infobox | decat = yes | child = yes
| label1 = Label 2.1
| data1 = Data 2.1
}}
| belowstyle =
| below = Below text
}}
</syntaxhighlight>{{clear}}
Note that omitting the {{para|title}} parameter, and not including any text preceding the embedded infobox, may result in spurious blank table rows, creating gaps in the visual presentation. The garbage output can be suppressed using {{para|rowstyleN|display: none}}, replacing N with the data/header number.
[[Wikipedia:WikiProject Infoboxes/embed]] includes some links to Wikipedia articles which include infoboxes embedded within other infoboxes.
== Subboxes ==
An alternative method for embedding is to use {{para|subbox|yes}}, which removes the outer border from the infobox, but preserves the interior structure. One feature of this approach is that the parent and child boxes need not have the same structure, and the label and data fields are not aligned between the parent and child boxes because they are not in the same parent table.
{{Infobox
| headerstyle = background-color:#eee;
| labelstyle = background-color:#eee;
| header1 = Main 1
| header2 = Main 2
| data3 = {{Infobox | subbox = yes
| headerstyle = background-color:#ccc;
| labelstyle = background-color:#ddd;
| header1 = Sub 3-1
| header2 = Sub 3-2
| label3 = Label 3-3 | data3 = Data 3-3
}}
| data4 = {{Infobox | subbox = yes
| labelstyle = background-color:#ccc;
| label1 = Label 4-1 | data1 = Data 4-1
}}
| label5 = Label 5 | data5 = Data 5
| header6 = Main 6
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| headerstyle = background-color:#eee;
| labelstyle = background-color:#eee;
| header1 = Main 1
| header2 = Main 2
| data3 = {{Infobox | subbox = yes
| headerstyle = background-color:#ccc;
| labelstyle = background-color:#ddd;
| header1 = Sub 3-1
| header2 = Sub 3-2
| label3 = Label 3-3 | data3 = Data 3-3
}}
| data4 = {{Infobox | subbox = yes
| labelstyle = background-color:#ccc;
| label1 = Label 4-1 | data1 = Data 4-1
}}
| label5 = Label 5 | data5 = Data 5
| header6 = Main 6
}}
</syntaxhighlight>{{clear}}
Similar embedding techniques may be used within content parameters of some other templates generating tables (such as [[:Template:Sidebar|Sidebar]]) :
{{Sidebar
| navbar = off
| headingstyle = background-color:#eee;
| heading1 = Heading 1
| heading2 = Heading 2
| content3 = {{Infobox | subbox = yes
| headerstyle = background-color:#ccc;
| labelstyle = background-color:#ddd;
| header1 = Sub 3-1
| header2 = Sub 3-2
| label3 = Label 3-3 | data3 = Data 3-3
}}
| content4 = {{Infobox | subbox = yes
| labelstyle = background-color:#ccc;
| label1 = Label 4-1 | data1 = Data 4-1
}}
| heading5 = Heading 5
}}
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Sidebar
| navbar = off
| headingstyle = background-color:#eee;
| heading1 = Heading 1
| heading2 = Heading 2
| content3 = {{Infobox | subbox = yes
| headerstyle = background-color:#ccc;
| labelstyle = background-color:#ddd;
| header1 = Sub 3-1
| header2 = Sub 3-2
| label3 = Label 3-3 | data3 = Data 3-3
}}
| content4 = {{Infobox | subbox = yes
| labelstyle = background-color:#ccc;
| label1 = Label 4-1 | data1 = Data 4-1
}}
| heading5 = Heading 5
}}
</syntaxhighlight>{{clear}}
Note that the default padding of the parent data cell containing each subbox is still visible, so the subboxes are slightly narrower than the parent box and there's a higher vertical spacing between standard cells of the parent box than between cells of distinct subboxes.
== Controlling line-breaking in embedded bulletless lists ==
Template {{tlx|nbsp}} may be used with {{tlx|wbr}} and {{tlx|nowrap}} to control line-breaking in bulletless lists embedded in infoboxes (e.g. cast list in {{tlx|Infobox film}}), to prevent wrapped long entries from being confused with multiple entries. See [[Template:Wbr/doc#Controlling line-breaking in infoboxes]] for details.
== Full blank syntax ==
(Note: there is no limit to the number of possible rows; only 20 are given below since infoboxes larger than that will be relatively rare. Just extend the numbering as needed. The microformat "class" parameters are also omitted as they are not commonly used.)
<syntaxhighlight lang="wikitext" style="overflow:auto">
{{Infobox
| name = {{subst:PAGENAME}}
| child = {{{child|}}}
| subbox = {{{subbox|}}}
| italic title = {{{italic title|no}}}
| templatestyles =
| child templatestyles =
| grandchild templatestyles =
| bodystyle =
| titlestyle =
| abovestyle =
| subheaderstyle =
| title =
| above =
| subheader =
| imagestyle =
| captionstyle =
| image =
| caption =
| image2 =
| caption2 =
| headerstyle =
| labelstyle =
| datastyle =
| header1 =
| label1 =
| data1 =
| header2 =
| label2 =
| data2 =
| header3 =
| label3 =
| data3 =
| header4 =
| label4 =
| data4 =
| header5 =
| label5 =
| data5 =
| header6 =
| label6 =
| data6 =
| header7 =
| label7 =
| data7 =
| header8 =
| label8 =
| data8 =
| header9 =
| label9 =
| data9 =
| header10 =
| label10 =
| data10 =
| header11 =
| label11 =
| data11 =
| header12 =
| label12 =
| data12 =
| header13 =
| label13 =
| data13 =
| header14 =
| label14 =
| data14 =
| header15 =
| label15 =
| data15 =
| header16 =
| label16 =
| data16 =
| header17 =
| label17 =
| data17 =
| header18 =
| label18 =
| data18 =
| header19 =
| label19 =
| data19 =
| header20 =
| label20 =
| data20 =
| belowstyle =
| below =
}}
</syntaxhighlight>{{clear}}
{{Help:Infobox/user style}}
== Porting to other MediaWikis ==
The infobox template requires the [[:mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions. [[Wikipedia:WikiProject Transwiki|WikiProject Transwiki]] has a version of this template that has been modified to work on other MediaWikis.
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "This template is intended as a meta template, a template used for constructing other templates. In general, it is not meant for use directly in an article but can be used on a one-off basis if required.",
"format": "{{_\n| ________________ = _\n}}\n",
"params": {
"title": {
"label": "Title",
"description": "Title displayed above the infobox",
"type": "string",
"suggested": true
},
"image": {
"label": "Image",
"description": "Image illustrating the topic. Use full image syntax.",
"type": "content",
"suggested": true,
"example": "[[File:example.png|200px|alt=Example alt text]]"
},
"caption": {
"label": "Caption",
"description": "caption for the image",
"type": "content",
"suggested": true
}
},
"paramOrder": [
"title",
"image",
"caption"
]
}
</templatedata>
==Tracking categories==
* {{Category link with count|Articles with missing Wikidata information}}
* {{Category link with count|Articles using infobox templates with no data rows}}
* {{Category link with count|Pages using embedded infobox templates with the title parameter}}
==See also==
* [[Module:Infobox]], the [[WP:LUA|Lua]] module on which this template is based
* [[Module:Check for unknown parameters]]
* {{tl|Infobox3cols}}
* {{tl|Navbox}} and {{tl|Sidebar}}
* [[Wikipedia:List of infoboxes|List of infoboxes]]
* [[:Module:InfoboxImage]]
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Infobox templates| ]]
[[Category:Wikipedia metatemplates|Infobox]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates based on the Infobox Lua module]]
}}</includeonly>
b7ba187ea76ee960bbe295ad01c44c646eaedadb
User:Silentg/sandbox
2
80
96
2023-10-08T05:04:33Z
Silentg
2
Created page with "{{Infobox | name = Hai | image = | caption1 = | label1 = Former names | data1 = {{{former_names|}}} | header2 = General information | label3 = Status | data3 = {{{status|}}} ... <!-- etc. --> }}"
wikitext
text/x-wiki
{{Infobox
| name = Hai
| image =
| caption1 =
| label1 = Former names
| data1 = {{{former_names|}}}
| header2 = General information
| label3 = Status
| data3 = {{{status|}}}
... <!-- etc. -->
}}
aa5a09a27f3d952d9777030608a9681c814b1034
Template:Documentation subpage
10
81
97
2023-10-08T05:06:27Z
Silentg
2
Created page with "<includeonly><!-- -->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}} | <!--(this template has been transcluded on a /doc or /{{{override}}} page)--> </includeonly><!-- -->{{#ifeq:{{{doc-notice|show}}} |show | {{Mbox | type = notice | style = margin-bottom:1.0em; | image = [[File:Edit-copy green.svg|40px|alt=|link=]] | text = {{strong|This is a [[Wikipedia:Template documentation|documentation]]..."
wikitext
text/x-wiki
<includeonly><!--
-->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}}
| <!--(this template has been transcluded on a /doc or /{{{override}}} page)-->
</includeonly><!--
-->{{#ifeq:{{{doc-notice|show}}} |show
| {{Mbox
| type = notice
| style = margin-bottom:1.0em;
| image = [[File:Edit-copy green.svg|40px|alt=|link=]]
| text =
{{strong|This is a [[Wikipedia:Template documentation|documentation]] [[Wikipedia:Subpages|subpage]]}} for {{terminate sentence|{{{1|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}}}<br />It may contain usage information, [[Wikipedia:Categorization|categories]] and other content that is not part of the original {{#if:{{{text2|}}} |{{{text2}}} |{{#if:{{{text1|}}} |{{{text1}}} |{{#ifeq:{{SUBJECTSPACE}} |{{ns:User}} |{{lc:{{SUBJECTSPACE}}}} template page |{{#if:{{SUBJECTSPACE}} |{{lc:{{SUBJECTSPACE}}}} page|article}}}}}}}}.
}}
}}<!--
-->{{DEFAULTSORT:{{{defaultsort|{{PAGENAME}}}}}}}<!--
-->{{#if:{{{inhibit|}}} |<!--(don't categorize)-->
| <includeonly><!--
-->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}
| [[Category:{{#switch:{{SUBJECTSPACE}} |Template=Template |Module=Module |User=User |#default=Wikipedia}} documentation pages]]
| [[Category:Documentation subpages without corresponding pages]]
}}<!--
--></includeonly>
}}<!--
(completing initial #ifeq: at start of template:)
--><includeonly>
| <!--(this template has not been transcluded on a /doc or /{{{override}}} page)-->
}}<!--
--></includeonly><noinclude>{{Documentation}}</noinclude>
41ca90af0945442788a2dbd08c8c54a61a23c057
Template:Mbox
10
82
98
2023-10-08T05:07:32Z
Silentg
2
Created page with "{{#invoke:Message box|mbox}}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude>"
wikitext
text/x-wiki
{{#invoke:Message box|mbox}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
5bfb2becf8bed35974b47e3ff8660dc14bee40c7
Template:Mbox/doc
10
83
99
2023-10-08T05:08:01Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{Used in system}} {{Lua|Module:Message box}} {{Mbox templates (small)}} {{tl|Mbox}} stands for '''M'''ulti-namespace message'''box''', a [[WP:MTM|metatemplate]] with which [[Wikipedia:Namespace|namespace]]-sensitive {{cl|Mbox and messagebox templates|messagebox templates}} can be implemented. The most common are {{tl|Ambox}} for art..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) -->
{{Used in system}}
{{Lua|Module:Message box}}
{{Mbox templates (small)}}
{{tl|Mbox}} stands for '''M'''ulti-namespace message'''box''', a [[WP:MTM|metatemplate]] with which [[Wikipedia:Namespace|namespace]]-sensitive {{cl|Mbox and messagebox templates|messagebox templates}} can be implemented.
The most common are {{tl|Ambox}} for articles, {{tl|Tmbox}} for talk pages, {{tl|Imbox}} for file (formerly image) pages, {{tl|Cmbox}} for category pages and {{tl|Ombox}} for other types of page.
== Usage ==
This template should only be used for message boxes that really need to adapt their style. Most message boxes do not need this and should use one of the varieties just listed. Using those templates directly means that your template will look the same on its template page and at any other place you show it, which makes it clear on what kind of pages it is supposed to be used. It also gives you access to any extra features those templates offer, and it saves some server load.
This template takes the same parameters as {{tl|Ambox}}, {{tl|Imbox}}, etc. Some of the boxes this template calls only handles images of max 52px width, thus that limitation also applies to this template or you will get ugly padding problems.
=== Parameters ===
List of all parameters:
<syntaxhighlight lang="wikitext">
{{Mbox
| name = name of the template
| demospace = {{{demospace|}}} / main / talk / file / category / other
| type = speedy / delete / content / style / notice / move / protection
| image = none / [[File:Some image.svg|40px]]
| imageright = [[File:Some image.svg|40px]]
| style=CSS values
| textstyle=CSS values
| text = The message body text.
| small = {{{small|left}}} / left / no
| smallimage = none / [[File:Some image.svg|30px]]
| smallimageright = none / [[File:Some image.svg|30px]]
| smalltext = A shorter message body text.
| plainlinks = no
}}
</syntaxhighlight>
Note: The small parameters only have effect when the template appears on an article, talk or "other" page type. For their associated documentation, see {{tl|Ambox}}, {{tl|Tmbox}} and/or {{tl|Ombox}}. Using the small parameters when they are not valid has no effect, but also does no harm.
== About demospace ==
This template optionally takes the "demospace" parameter as described at {{tl|Namespace detect}}. That parameter is only for testing and demonstration purposes. If you want to lock your message box to one style then instead use one of the other mboxes directly.
Namespace "Image:" was renamed to "File:" on 11 December 2008. This template was updated to understand both names well before that, thus it still works fine. For backwards compatibility it still understands "demospace = image" which means the same thing as "demospace = file". But using "demospace = image" is now deprecated.
== Mbox family ==
{{Mbox templates see also}}
== See also ==
* [[:Category:Mbox and messagebox templates]]
<includeonly>{{Sandbox other||
<!-- Add categories below this line, and interwikis at Wikidata -->
[[Category:Mbox and messagebox templates]]
}}</includeonly>
dbbcbe289453e8a63cd193995d11c994c1afa27c
Template:Documentation subpage/doc
10
84
100
2023-10-08T05:09:14Z
Silentg
2
Created page with "{{tsh|doc sub}} {{Documentation subpage}} {{high-use}} {{Distinguish|Template:Documentation}} This template displays a message that the current page is a documentation subpage. == Usage == : {{Template link expanded|Documentation subpage}} : or : {{Template link expanded|Documentation subpage |[[{{var|Page where the documentation is [[Help:Transclusion|transcluded]]}}]]}} ===Userbox documentation=== To set this template to use "userbox" and "userbox pag..."
wikitext
text/x-wiki
{{tsh|doc sub}}
{{Documentation subpage}}
{{high-use}}
{{Distinguish|Template:Documentation}}
This template displays a message that the current page is a documentation subpage.
== Usage ==
: {{Template link expanded|Documentation subpage}}
: or
: {{Template link expanded|Documentation subpage |[[{{var|Page where the documentation is [[Help:Transclusion|transcluded]]}}]]}}
===Userbox documentation===
To set this template to use "userbox" and "userbox page" rather than "{{lc:{{ns:Template}}}}" and "{{lc:{{ns:Template}}}} page" or "{{lc:{{ns:User}}}} template" and "{{lc:{{ns:User}}}} template page", use:
: {{Template link expanded|Userbox documentation subpage}}
: or
: {{Template link expanded|Userbox documentation subpage |[[{{var|userbox page}}]]}}
===Text customization===
The parameters {{para|text1}} and {{para|text2}} can be used to set the text of, respectively, the template's first and second lines. If ''text1'' is set but not ''text2'', both lines' text will derive from ''text1'':
{{Hidden begin |showhide=left |title=With ''text1'' and ''text2''}}
<code><nowiki>{{Documentation subpage |text1='''''text1 appears here''''' |text2='''''text2 appears here'''''}}</nowiki></code>
{{Documentation subpage |[''page''] |text1='''''text1 appears here''''' |text2='''''text2 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}}
{{Hidden end}}
{{Hidden begin |showhide=left |title=With ''text2'' only}}
<code><nowiki>{{Documentation subpage |text2='''''text2 appears here'''''}}</nowiki></code>
{{Documentation subpage |[''page''] |text2='''''text2 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}}
{{Hidden end}}
{{Hidden begin |showhide=left |title=With ''text1'' only}}
<code><nowiki>{{Documentation subpage |text1='''''text1 appears here'''''}}</nowiki></code>
{{Documentation subpage |[''page''] |text1='''''text1 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}}
{{Hidden end}}
===Other parameters===
{{para|inhibit|yes}} will prevent this template from generating any categories. (By default, "''Namespace'' documentation pages" (usually [[:Category:Template documentation pages]]) is added, or [[:Category:Documentation subpages without corresponding pages]] if the main page doesn't exist.)
== Display ==
This template should normally be placed at the top of /doc pages. It changes output depending on where it is viewed:
* On a /doc page, it displays a box explaining template documentation and links to the template page.
* On other pages – i.e. pages transcluding the /doc page – the template will not show. The template page itself (which contains <code>{{Template link|Documentation}}</code>) will automatically note that the documentation is [[Help:Transclusion|transcluded]] from a subpage.
== Module documentation ==
This template is automatically shown on /doc subpages in the [[Wikipedia:Namespace|module namespace]]. This is done automatically via [[MediaWiki:Scribunto-doc-page-header]].
== Automatic categorization ==
In addition to its message, the template adds pages to [[:Category:Template documentation pages]], [[:Category:User documentation pages]], or similar (named after the subject space), but only for documentation pages in namespaces with the subpage feature. It defaults the [[m:Help:Categories#Sort order|sort key]] to the page name without namespace: Template:Foo, for example, would be sorted as "Foo", i.e. under "F".
== See also ==
<includeonly>{{#switch:{{FULLPAGENAME}}
|Template:Userbox documentation subpage=
*{{Template link|Userbox/categories}}
*{{Template link|Userbox/citydoc}}}}</includeonly>
*{{Template link|Documentation/see also}}
*{{Template link|Documentation subpage}}
*{{Template link|Userspace disclaimers}}
*{{Template link|Userbox documentation subpage}}
<includeonly>{{Sandbox other||<!-- Make sure only the template page is categorised. No subpages, and not after transclusion. This /doc page is reused, btw.
-->{{#switch:{{FULLPAGENAME}}
|Template:Documentation subpage = [[Category:Template documentation| ]]
|Template:Userbox documentation subpage = [[Category:Template documentation| ]][[Category:Userboxes|Δ]]
}}
[[Category:Documentation header templates]]
}}</includeonly>
d1f2124df849a762883dcd9d41c601787fa54871
MediaWiki:Scribunto-doc-page-header
8
85
101
2023-10-08T05:12:15Z
Silentg
2
Created page with "<div class="mw-parser-output">{{#if:{{#invoke:redirect|isRedirect|{{FULLPAGENAME}}}}||{{#ifeq:{{#titleparts:{{PAGENAME}}|1|2}}|documentation||{{documentation subpage}}}}}}</div>"
wikitext
text/x-wiki
<div class="mw-parser-output">{{#if:{{#invoke:redirect|isRedirect|{{FULLPAGENAME}}}}||{{#ifeq:{{#titleparts:{{PAGENAME}}|1|2}}|documentation||{{documentation subpage}}}}}}</div>
91187e07e3e4b3cab7d0e1529a1be19884676a6d
User:Silentg
2
4
102
8
2023-10-08T05:13:55Z
Silentg
2
wikitext
text/x-wiki
Hello!
[[User:Silentg/sandbox]]
748aec06148a5900f9665ff9f921f69518b4c33c
Template:Distinguish
10
86
103
2023-10-08T05:15:46Z
Silentg
2
Created page with "{{#invoke:Distinguish|distinguish}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. --> {{Documentation}} <!-- Add categories to the /doc subpage and interwikis to Wikidata, not here! --> </noinclude>"
wikitext
text/x-wiki
{{#invoke:Distinguish|distinguish}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. -->
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis to Wikidata, not here! -->
</noinclude>
f949a4cbfd6eb0ab77b832e69059a40a964b1fd8
Template:Distinguish/doc
10
87
104
2023-10-08T05:16:45Z
Silentg
2
Created page with "{{Documentation subpage}} {{tsh|dist}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{High-use| 65005 }} {{Lua|Module:distinguish}} == Description == The "distinguish" template produces a [[WP:HAT|hatnote]] to point out to our readers the existence of one or more articles whose title(s) is, or are, similar to the page in question. It is used in cases where the distinction between the titles is generally o..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{tsh|dist}}
<!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) -->
{{High-use| 65005 }}
{{Lua|Module:distinguish}}
== Description ==
The "distinguish" template produces a [[WP:HAT|hatnote]] to point out to our readers the existence of one or more articles whose title(s) is, or are, similar to the page in question. It is used in cases where the distinction between the titles is generally obvious and does not need further explanation.
For those cases where an explanation is required, please use the templates {{tl|For}} and {{tl|About}}. For use on category pages, the corresponding template is {{Tl|Category distinguish}}.
== Usage ==
Here is an example of its standard usage (used, for purposes of this example, with the placeholder article "Foo"; the following could be placed on a theoretical article named "Foo (song)", or perhaps one named "Fou" or "Fu"):
{{tlx|distinguish|Foo}} → {{Distinguish|Foo}}
This hatnote can be used to distinguish the topic from multiple other topics:
{{tlx|distinguish|Foo|Bar}} → {{Distinguish|Foo|Bar}}
{{tlx|distinguish|Foo|Bar|Baz}} → {{Distinguish|Foo|Bar|Baz}}
The {{para|text}} parameter can be used to create customized text, in case context is required. An example is on the article [[Phobos (mythology)]], which contains a customized hatnote to distinguish it and "[[Phoebus]]" (a redirect of [[Apollo]]). Both links lead to topics about Greek gods, so the [[WP:NCDAB|parenthetical disambiguation]] in "Phobos (mythology)" is insufficient to disambiguate the two. Since it [[WP:HNR|is typically not preferable to link a redirect]] in a hatnote, the article "Apollo" is linked to directly and a short explanation fills in the necessary context:
{{tlx|distinguish|text {{=}} Phoebus, an epithet of the Greek god [[Apollo]]}} → {{Distinguish|text = Phoebus, an epithet of the Greek god [[Apollo]] }}
Note that a final period is automatically added at the end of the sentence, and that only one blue link is used per disambiguated topic (i.e, do not type <code><nowiki>...an [[epithet]] of the [[Greek]] god [[Apollo]].</nowiki></code>
When the target is a disambiguation page, display of the parentheses may be avoided by escaping the vertical bar using the [[Help:Magic words|magic word]] {{Tl|!}}:
{{Tick}}{{tlx|distinguish|Crossfire (disambiguation){{!}}Crossfire}} → {{Distinguish|Crossfire (disambiguation){{!}}Crossfire}}
The escape is necessary, otherwise the template will read the next text as another topic:
{{Cross}}{{tlx|distinguish|Crossfire (disambiguation)|Crossfire}} → {{Distinguish|Crossfire (disambiguation)|Crossfire}}
== When to use ==
This hatnote is generally used when readers have misspelled their desired title, and the error would be apparent by simply displaying the alternative term without further explanation. For example, consider a reader looking for the punctuation mark who instead ends up at [[coma]]:
: [[Coma]]
: {{Distinguish|Comma}}
Readers are presumed to recognize that they actually wanted ''comma'' by merely looking at the spelling, and this case generally requires no further explanation.
However, {{tlx|distinguish}} is not suitable when the difference is not readily apparent without additional details. Consider a reader looking for a game they believe is named Reversi:
: {{cross}} [[Reversi]]
: {{Distinguish|Reversis}}
In the above hatnote, it is not generally apparent how the suggested Reversis is different from Reversi, which is also a game.
In this case you should use {{tlx|about}} instead of {{tlc|distinguish}}. The difference is to provide explanation upfront without requiring the reader to click through and differentiate the terms on their own.
: {{tick}} [[Reversi]]
:: ''This article is about the board game. For the card game, see [[Reversis]].''
{{tlc|Distinguish}} should only be used when the ambiguity exists for a portion of the readership that is sufficient to warrant a hatnote. Care should be taken to [[WP:TRHAT|avoid trivial uses]].
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "Name of article",
"description": "Name of article that you want to link to",
"type": "wiki-page-name",
"suggested": true
},
"2": {
"label": "Optional additional article to link (2)",
"description": "Optional additional article to link",
"type": "wiki-page-name"
},
"3": {
"label": "Optional additional article to link (3)",
"description": "Optional additional article to link",
"type": "wiki-page-name"
},
"4": {
"label": "Optional additional article to link (4)",
"description": "Optional additional article to link",
"type": "wiki-page-name"
},
"text": {
"label": "Custom text",
"description": "Custom message in wikitext; e.g. \"[[foo]] and [[Bar (computer science)|bar]]\" produces \"Not to be confused with [[foo]] and [[Bar (computer science)|bar]].\"",
"type": "string"
},
"selfref": {
"label": "Self reference",
"description": "If set, marks note as being a self reference, to not be shown when content is reused",
"type": "boolean"
}
},
"description": "A hatnote used when there is an ambiguity in an article's title.",
"paramOrder": [
"1",
"2",
"3",
"4",
"text",
"selfref"
],
"format": "inline"
}
</templatedata>
== Redirects ==
* {{tl|Confused}}
* {{tl|Confuse}}
* {{tl|Misspelling}}
* {{tl|Nottobeconfusedwith}}
* {{tl|Ntbcw}}
== See also ==
* {{tl|About}}
* {{tl|Category distinguish}}
* {{tl|For}}
* {{tl|Redirect}}
* {{tl|R from misspelling}}
{{Hatnote templates}}
<includeonly>{{sandbox other||
<!-- Add categories below this line, and interwikis at Wikidata -->
[[Category:Disambiguation and redirection templates]]
[[Category:Hatnote templates]]
}}</includeonly>
86c325ae7de845d5db3beba07711e598cc2c1092
Module:Distinguish
828
88
105
2023-10-08T05:17:29Z
Silentg
2
Created page with "local mHatnote = require('Module:Hatnote') local mHatlist = require('Module:Hatnote list') local mArguments --initialize lazily local mTableTools --initialize lazily local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.distinguish(frame) mArguments = require('Module:Arguments') mTableTools = require('Module:TableTools') local args = mArguments.getArgs(frame) local selfref = args.selfref local text = args.text a..."
Scribunto
text/plain
local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments --initialize lazily
local mTableTools --initialize lazily
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
function p.distinguish(frame)
mArguments = require('Module:Arguments')
mTableTools = require('Module:TableTools')
local args = mArguments.getArgs(frame)
local selfref = args.selfref
local text = args.text
args = mTableTools.compressSparseArray(args)
return p._distinguish(args, text, selfref)
end
function p._distinguish(args, text, selfref)
checkType("_distinguish", 1, args, 'table')
if #args == 0 and not text then return '' end
local text = string.format(
'Not to be confused with %s.',
text or mHatlist.orList(args, true)
)
hnOptions = {selfref = selfref}
return mHatnote._hatnote(text, hnOptions)
end
return p
0364d14af01fc656ad1d898c5036fbd12a7ca938
Module:Distinguish/doc
828
89
106
2023-10-08T05:18:01Z
Silentg
2
Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Module rating|protected}} Implements {{tl|distinguish}}. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules]] }}</includeonly>"
wikitext
text/x-wiki
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{Module rating|protected}}
Implements {{tl|distinguish}}.
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Hatnote modules]]
}}</includeonly>
4e58b9411cafedca1f5352bf895ba0b4bbdd1487
Module:Hatnote
828
90
107
2023-10-08T05:19:44Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules...."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
3ae1ed7094c5005ca0896395ec9a587287a0bef1
Module:Hatnote/doc
828
91
108
2023-10-08T05:20:13Z
Silentg
2
Created page with "{{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} {{Uses TemplateStyles|Module:Hatnote/styles.css}} This is a meta-module that provides various functions for making [[Wikipedia:Hatnote|hatnotes]]. It implements the {{tl|hatnote}} template, for use in hatnotes at the top of pages. It also contains a number of helper functions for use in other Lua hatnote modules. == Use from wikitext == The function..."
wikitext
text/x-wiki
{{used in system|in [[MediaWiki:Wantedpages-summary]]}}
{{module rating|protected}}
{{Lua|Module:Yesno|Module:Arguments}}
{{Uses TemplateStyles|Module:Hatnote/styles.css}}
This is a meta-module that provides various functions for making [[Wikipedia:Hatnote|hatnotes]]. It implements the {{tl|hatnote}} template, for use in hatnotes at the top of pages. It also contains a number of helper functions for use in other Lua hatnote modules.
== Use from wikitext ==
The functions in this module cannot be used directly from #invoke, and must be used through templates instead. Please see [[Template:Hatnote]] and [[Template:Format link]] for documentation.
== Use from other Lua modules ==
To load this module from another Lua module, use the following code.
<syntaxhighlight lang="lua">
local mHatnote = require('Module:Hatnote')
</syntaxhighlight>
You can then use the functions as documented below.
=== Hatnote ===
<syntaxhighlight lang="lua">
mHatnote._hatnote(s, options)
</syntaxhighlight>
Formats the string <var>s</var> as a hatnote. This encloses <var>s</var> in the tags {{tag|div|params=class="hatnote"}}. Options are provided in the <var>options</var> table. Options include:
* <var>options.extraclasses</var> - a string of extra classes to provide
* <var>options.selfref</var> - if this is not nil or false, adds the class "selfref", used to denote self-references to Wikipedia (see [[Template:Selfref]]))
The CSS of the hatnote class is defined in [[Module:Hatnote/styles.css]].
; Example 1
<syntaxhighlight lang="lua">
mHatnote._hatnote('This is a hatnote.')
</syntaxhighlight>
Produces:
{{tag|div|content=This is a hatnote.|params=class="hatnote"}}
Displays as:
{{hatnote|This is a hatnote.}}
; Example 2
<syntaxhighlight lang="lua">
mHatnote._hatnote('This is a hatnote.', {extraclasses = 'boilerplate seealso', selfref = true})
</syntaxhighlight>
Produces:
{{tag|div|content=This is a hatnote.|params=class="hatnote boilerplate seealso selfref"}}
Displayed as:
{{hatnote|This is a hatnote.|extraclasses=boilerplate seealso|selfref=true}}
=== Find namespace id ===
<syntaxhighlight lang="lua">
mHatnote.findNamespaceId(link, removeColon)
</syntaxhighlight>
Finds the [[WP:NS|namespace id]] of the string <var>link</var>, which should be a valid page name, with or without the section name. This function will not work if the page name is enclosed with square brackets. When trying to parse the namespace name, colons are removed from the start of the link by default. This is helpful if users have specified colons when they are not strictly necessary. If you do not need to check for initial colons, set <var>removeColon</var> to false.
;Examples:
: {{code|mHatnote.findNamespaceId('Lion')|lua}} → 0
: {{code|mHatnote.findNamespaceId('Category:Lions')|lua}} → 14
: {{code|mHatnote.findNamespaceId(':Category:Lions')|lua}} → 14
: {{code|mHatnote.findNamespaceId(':Category:Lions', false)|lua}} → 0 (the namespace is detected as ":Category", rather than "Category")
=== Make wikitext error ===
<syntaxhighlight lang="lua">
mHatnote.makeWikitextError(msg, helpLink, addTrackingCategory)
</syntaxhighlight>
Formats the string <var>msg</var> as a red wikitext error message, with optional link to a help page <var>helpLink</var>. Normally this function also adds {{clc|Hatnote templates with errors}}. To suppress categorization, pass <code>false</code> as third parameter of the function (<code>addTrackingCategory</code>).
Examples:
:{{code|mHatnote.makeWikitextError('an error has occurred')|lua}} → <strong class="error">Error: an error has occurred.</strong>
:{{code|mHatnote.makeWikitextError('an error has occurred', 'Template:Example#Errors')|lua}} → <strong class="error">Error: an error has occurred ([[Template:Example#Errors|help]]).</strong>
== Examples ==
For an example of how this module is used in other Lua modules, see [[Module:Labelled list hatnote]]
<includeonly>{{Sandbox other||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Hatnote modules| ]]
[[Category:Modules that add a tracking category]]
}}</includeonly>
d725b1aad3679d946ab3acb7975c0328b70aeac0
Module:Hatnote list
828
92
109
2023-10-08T05:21:25Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introd..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote list --
-- --
-- This module produces and formats lists for use in hatnotes. In particular, --
-- it implements the for-see list, i.e. lists of "For X, see Y" statements, --
-- as used in {{about}}, {{redirect}}, and their variants. Also introduced --
-- are andList & orList helpers for formatting lists with those conjunctions. --
--------------------------------------------------------------------------------
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
--------------------------------------------------------------------------------
-- List stringification helper functions
--
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
conjunction = "and",
separator = ",",
altSeparator = ";",
space = " ",
formatted = false
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
if #list == 0 then return nil end
checkType("stringifyList", 2, options, "table", true)
options = options or {}
for k, v in pairs(stringifyListDefaultOptions) do
if options[k] == nil then options[k] = v end
end
local s = options.space
-- Format the list if requested
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
for k, v in pairs(list) do
if searchDisp(v, separator) then
separator = options.altSeparator
break
end
end
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
end
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
--------------------------------------------------------------------------------
-- For see
--
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
otherText = 'other uses',
forSeeForm = 'For %s, see %s.',
}
--Collapses duplicate punctuation
local function punctuationCollapse (text)
local replacements = {
["%.%.$"] = ".",
["%?%.$"] = "?",
["%!%.$"] = "!",
["%.%]%]%.$"] = ".]]",
["%?%]%]%.$"] = "?]]",
["%!%]%]%.$"] = "!]]"
}
for k, v in pairs(replacements) do text = string.gsub(text, k, v) end
return text
end
-- Structures arguments into a table for stringification, & options
function p.forSeeArgsToTable (args, from, options)
-- Type-checks and defaults
checkType("forSeeArgsToTable", 1, args, 'table')
checkType("forSeeArgsToTable", 2, from, 'number', true)
from = from or 1
checkType("forSeeArgsToTable", 3, options, 'table', true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- maxArg's gotten manually because getArgs() and table.maxn aren't friends
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then maxArg = k end
end
-- Structure the data out from the parameter list:
-- * forTable is the wrapper table, with forRow rows
-- * Rows are tables of a "use" string & a "pages" table of pagename strings
-- * Blanks are left empty for defaulting elsewhere, but can terminate list
local forTable = {}
local i = from
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
repeat
-- New empty row
local forRow = {}
-- On blank use, assume list's ended & break at end of this loop
forRow.use = args[i]
if not args[i] then terminated = true end
-- New empty list of pages
forRow.pages = {}
-- Insert first pages item if present
table.insert(forRow.pages, args[i + 1])
-- If the param after next is "and", do inner loop to collect params
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
-- Increment to next "and"
i = i + 2
end
-- Increment to next use
i = i + 2
-- Append the row
table.insert(forTable, forRow)
until terminated or i > maxArg
return forTable
end
-- Stringifies a table as formatted by forSeeArgsToTable
function p.forSeeTableToString (forSeeTable, options)
-- Type-checks and defaults
checkType("forSeeTableToString", 1, forSeeTable, "table", true)
checkType("forSeeTableToString", 2, options, "table", true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Stringify each for-see item into a list
local strList = {}
if forSeeTable then
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
table.insert(strList, forSeeStr)
end
end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
return table.concat(strList, ' ')
end
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
local forSeeTable = p.forSeeArgsToTable(args, from, options)
return p.forSeeTableToString(forSeeTable, options)
end
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
end
return p
d0828422b1aa0d0d0092d699d059c9e882260398
Module:Hatnote list/doc
828
93
110
2023-10-08T05:21:49Z
Silentg
2
Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{used in system|in [[MediaWiki:Wantedpages-summary]]}} == Usage from wikitext == This module is not designed be used directly from wikitext even though <code>forSee</code> does take an initial <code>frame</code> argument and could potentially be used from wikitext, e.g.: *<code><nowiki>{{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|Fo..."
wikitext
text/x-wiki
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{used in system|in [[MediaWiki:Wantedpages-summary]]}}
== Usage from wikitext ==
This module is not designed be used directly from wikitext even though <code>forSee</code> does take an initial <code>frame</code> argument and could potentially be used from wikitext, e.g.:
*<code><nowiki>{{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|For}}|Module:For|{{tl|About}}|Module:About}} POSTFIX}}</nowiki></code> → {{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|For}}|Module:For|{{tl|About}}|Module:About}} POSTFIX}}
== Usage from Lua ==
To call the module, use <syntaxhighlight lang="lua">local mHatList = require('Module:Hatnote list')</syntaxhighlight> or similar, then access its methods through the <code>mHatList</code> variable (or whatever was used).
===andList===
<code>andList</code> takes a list in table form, and returns a string with the list separated with "and" and commas as appropriate.
===orList===
<code>orList</code> takes a list in table form, and returns a string with the list separated with "or" and commas as appropriate.
===forSee===
<code>_forSee</code> takes three arguments: a table of trimmed arguments with blanks removed, a "from" number with the index to start at, and an options table, and returns a string with a number of "<code><nowiki>For X, see [[Y]]</nowiki></code>" sentences. The links are formatted using the methods from [[Module:Hatnote]].
As a convenience, the <code>forSee</code> method (without the leading underscore) takes the same arguments except with a frame instead of an args table, using <code>getArgs()</code> from [[Module:Arguments]] to preprocess the arguments.
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Hatnote modules| ]]
}}</includeonly>
185773df40049bb4687884580b408617c8ecc548
Module:Hatnote/styles.css
828
94
111
2023-10-08T05:22:56Z
Silentg
2
Created page with "/* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; }"
sanitized-css
text/css
/* {{pp|small=y}} */
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
44680ffd6e888866df2cdfa0341af9c7b97da94c
Module:Format link
828
95
112
2023-10-08T05:24:04Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the {{format link}} template. -------------------------------------------------------------------------------- local libraryUtil = require(..."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local mError -- lazily initialise [[Module:Error]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
local function maybeItalicize(s, shouldItalicize)
-- Italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return '<i>' .. s .. '</i>'
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
local function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- output of parseLink) and an options table (matching the input options for
-- _formatLink).
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if (not section) then
return page
elseif (not page) then
return mw.ustring.format('§ %s', section)
else
return mw.ustring.format('%s § %s', page, section)
end
end
local function missingArgError(target)
mError = require('Module:Error')
return mError.error{message =
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])'
}
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1] or args.link
local target = args[3] or args.target
if not (link or target) then
return missingArgError('Template:Format link')
end
return p._formatLink{
link = link,
display = args[2] or args.display,
target = target,
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
categorizeMissing = args.categorizemissing
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
local function check(key, expectedType) --for brevity
checkTypeForNamedArg(
'_formatLink', key, options[key], expectedType or 'string', true
)
end
check('link')
check('display')
check('target')
check('italicizePage', 'boolean')
check('italicizeSection', 'boolean')
check('categorizeMissing')
-- Normalize link and target and check that at least one is present
if options.link == '' then options.link = nil end
if options.target == '' then options.target = nil end
if not (options.link or options.target) then
return missingArgError('Module:Format link')
end
local parsed = parseLink(options.link)
local display = options.display or parsed.display
local catMissing = options.categorizeMissing
local category = ''
-- Find the display text
if not display then display = formatDisplay(parsed, options) end
-- Handle the target option if present
if options.target then
local parsedTarget = parseLink(options.target)
parsed.link = parsedTarget.link
parsed.page = parsedTarget.page
end
-- Test if page exists if a diagnostic category is specified
if catMissing and (mw.ustring.len(catMissing) > 0) then
local title = nil
if parsed.page then title = mw.title.new(parsed.page) end
if title and (not title.isExternal) then
local success, exists = pcall(function() return title.exists end)
if success and not exists then
category = mw.ustring.format('[[Category:%s]]', catMissing)
end
end
end
-- Format the result as a link
if parsed.link == display then
return mw.ustring.format('[[:%s]]%s', parsed.link, category)
else
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category)
end
end
--------------------------------------------------------------------------------
-- Derived convenience functions
--------------------------------------------------------------------------------
function p.formatPages(options, pages)
-- Formats an array of pages using formatLink and the given options table,
-- and returns it as an array. Nil values are not allowed.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{
link = page,
categorizeMissing = options.categorizeMissing,
italicizePage = options.italicizePage,
italicizeSection = options.italicizeSection
}
end
return ret
end
return p
5c878065ff3809629376f94da43cf39a395b01b1
Module:Format link/doc
828
96
113
2023-10-08T05:24:21Z
Silentg
2
Created page with "<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{used in system|in [[MediaWiki:Perfcachedts]]}} This module, migrated from origins in [[Module:Hatnote]], provides functionality for formatting links for display, including that powering the {{tl|format link}} template. It can pretty-format section links with the section symbol ("§") and appropriate whitespace, it automatically escapes category and file names with the Help:..."
wikitext
text/x-wiki
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{used in system|in [[MediaWiki:Perfcachedts]]}}
This module, migrated from origins in [[Module:Hatnote]], provides functionality for formatting links for display, including that powering the {{tl|format link}} template.
It can pretty-format section links with the section symbol ("§") and appropriate whitespace, it automatically escapes category and file names with the [[Help:Colon trick|colon trick]], and includes functionality for italicizing the page or section name, and for detecting and categorizing results that produce [[Wikipedia:Red link|red links]].
== Use from wikitext ==
The functions in this module cannot be used directly from #invoke, and must be used through templates instead. Please see [[Template:Format link]] for documentation on usage of that template.
== Use from other Lua modules==
To load this module from another Lua module, use the following code:
<syntaxhighlight lang="lua">
local mFormatLink = require('Module:Format link')
</syntaxhighlight>
You can then use the functions as documented below.
=== _formatLink ===
<syntaxhighlight lang="lua">
mFormatLink._formatLink{
link = 'Link',
display = 'Display',
target = 'Target',
italicizePage = true,
italicizeSection = true,
categorizeMissing = 'Pages using formatted red links'
}
</syntaxhighlight>
Formats <var>link</var> as a wikilink. Categories and files are automatically escaped with the [[Help:Colon trick|colon trick]], and links to sections are automatically formatted as ''page § section'', rather than the MediaWiki default of ''page#section''.
Several options modify the output:
* If the <var>display</var> value is present, then it will be used as a display value. Any manual piping (using the <code><nowiki>{{!}}</nowiki></code> magic word or similar) present in <var>link</var> will be overridden by the <var>display</var> value if present.
* If the <var>target</var> value is present, then it will override <var>link</var> as a target, but the result will still be ''displayed'' using either the value from <var>display</var>, or the result of formatting <var>link</var>.
* If <var>italicizePage</var> is true, then the page portion of the link is italicized if present.
* If <var>italicizeSection</var> is true, then the section portion of the link is italicized if present.
* If <var>categorizeMissing</var> is a non-empty string, then that value is used as a category name, and that category will be applied if the resulting target of the link (no matter whether through <var>link</var> or through <var>target</var>) doesn't exist.
;Examples:
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Foo#Bar'}</syntaxhighlight> → <nowiki>[[:Foo#Bar|Foo §&nbsp;Bar]]</nowiki> → {{format link|Foo#Bar}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Baz', display = 'Qux'}</syntaxhighlight> → <nowiki>[[:Baz|Qux]]</nowiki> → {{format link|Baz|Qux}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Foo|Bar', display = 'Baz'}</syntaxhighlight> → <nowiki>[[:Foo|Baz]]</nowiki> → {{format link|Foo{{!}}Bar|Baz}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = '#Foo', target = 'Example#Foo'}</syntaxhighlight> → <nowiki>[[:Example#Foo|§&nbsp;Foo]]</nowiki> → {{format link|#Foo||Example#Foo}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'The Lord of the Rings#Plot', italicizePage = true}</syntaxhighlight> → <nowiki>[[:The Lord of the Rings#Plot|''The Lord of the Rings'' §&nbsp;Plot]]</nowiki> → {{format link|The Lord of the Rings#Plot|italicizepage=true}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice', italicizeSection = true}</syntaxhighlight> → <nowiki>[[:Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice|Cybercrime Prevention Act of 2012 §&nbsp;''Disini v. Secretary of Justice'']]</nowiki> → {{format link|Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice|italicizesection=true}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Nonexistent page', categorizeMissing = 'Example'}</syntaxhighlight> → <nowiki>[[:Nonexistent page]][[Category:Example]]</nowiki> → {{format link|Nonexistent page}}
: <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Existing', categorizeMissing = 'Example'}</syntaxhighlight> → <nowiki>[[:Existing]]</nowiki> → {{format link|Existing}}
=== formatPages ===
<syntaxhighlight lang="lua">
mFormatLink.formatPages(options, pages)
</syntaxhighlight>
This derived function is useful for lists that format many links. It formats an array of pages using the [[#_formatLink|_formatLink]] function, and returns the result as an array. Options in the <var>options</var> table are applied, and use the same names as the options for <var>_formatLink</var>.
;Example
:{{code|<nowiki>mFormatLink.formatPages({categorizeMissing = 'Example'}, {'Foo#Bar', 'Nonexistent page'})</nowiki>|lua}} → {{code|<nowiki>{'[[:Foo#Bar|Foo § Bar]]', '[[:Nonexistent page]][[Category:Example]]'}</nowiki>|lua}}
== Errors ==
If <var>_formatLink</var> is used and neither a <var>link</var> nor a <var>target</var> argument is provided, then the module will produce an error message instead of its usual output, as it ''cannot'' then produce valid output.
You can solve this error by providing appropriate parameters to <var>_formatLink</var>, or you may want to ensure that a more descriptive error is provided by a downstream template or module when it would otherwise call <var>_formatLink</var> with inadequate arguments.
<includeonly>{{Sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
}}</includeonly>
14a0e689d62837cacb851622e107ceb7dd886c88
Template:High-use
10
97
114
2023-10-08T05:28:52Z
Silentg
2
Created page with "{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude> {{Documentation}} <!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! --> </noinclude>"
wikitext
text/x-wiki
{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! -->
</noinclude>
a3322d1bd47ac03df14fa2090855cff4fede9bc7
Template:High-use/doc
10
98
115
2023-10-08T05:29:13Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{High-use}} {{lua|Module:High-use}} This is the {{tlx|high-use}} message box. It is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, then a stronger wording is given. '''Note''': I..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{High-use}}
{{lua|Module:High-use}}
This is the {{tlx|high-use}} message box.
It is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, then a stronger wording is given.
'''Note''': It is normal that some of the links in the message box are red.
== Usage ==
{{tlx |High-use}}
{{tlx |High-use |2=2=''discussion page, or use + notation'' |3=info=''additional text'' }}
'''all parameters'''
<pre style="overflow:auto;">
{{High-use |1= |2= |info= |demo= |form= |expiry= }}
</pre>
The template can be used as is, and will automatically use bot-updated transclusion counts from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]], when available. It can also take some parameters:
* <code>1=''number of transclusions''</code>: ''(deprecated)'' The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored, if transclusion data is available for the current page (generally, for templates with more than 2,000 transclusions).
* <code>2=''discussion page, or use + notation''</code>: The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]),
* {{para|info|<{{var|extra information}}>}}: When set to non-blank, will insert <{{var|extra information}}> into the template text.
* {{para|demo|<{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki><{{var|Template_name}}>]]</code> instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]].
* {{para|form}}: When set to "<code>editnotice</code>", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}.
* {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}.
* {{para|no-percent|yes}}: suppresses automatic 'percent of all pages' annotation; 'percent of all pages' annotation is automatically added when template is used in more than 1% of all pages (currently <code><nowiki>{{NUMBEROFPAGES}}</nowiki></code> is {{NUMBEROFPAGES}} pages so 1% is {{formatnum:{{#expr:trunc ({{formatnum:{{NUMBEROFPAGES}}|R}}/100)}}}} pages)
== Examples ==
The full code for a /doc page top usually looks like this:
<pre>
{{documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{high-use}}
</pre>
=== Standard form ===
{{nowiki template demo|code=<nowiki>{{high-use}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use | |Wikipedia talk:High-risk templates }}</nowiki>}}
=== Rounding and + notation ===
{{nowiki template demo|code=<nowiki>{{high-use |49,500 |demo=A template that does not exist }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |49,500+ |demo=A template that does not exist }}</nowiki>}}
=== Editnotice form ===
{{nowiki template demo|code=<nowiki>{{high-use |form=editnotice }}</nowiki>}}
=== High risk ===
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno |no-percent=yes}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |demo=High-use }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |Wikipedia talk:High-risk templates |info=This is a very large number! |demo=Yesno}}</nowiki>}}
== Technical details ==
The [[Template:High-use/sandbox|/sandbox]] and [[Template:High-use/testcases|/testcases]] links are the standard names for such subpages. If those pages are created, then the green /doc box for the template will detect them and link to them in its heading. For instance, see the top of this documentation.
[[User:Ahechtbot|Ahechtbot]] compiles usage statistics for all templates with 2,000 or more transclusions, using [[User:Ahechtbot/transclusioncount.py]], and writes them to subpages of [[Module:Transclusion count/data]] (see [[Wikipedia:Bots/Requests for approval/Ahechtbot 6]]). These pages are usually updated every Sunday, but since running the query is resource intensive, it may be delayed or skipped if Wikipedia server usage is high. '''Important''': If a transclusion count is available in [[Module:Transclusion count/data]], any manually input values will be ignored by this template.
== Supporting templates and modules ==
* {{tl|ombox}} which uses {{module link|Message box|ombox}}
* {{tl|editnotice}} which uses {{module link|Message box|fmbox}}
* {{module link|high-use|main}}
* {{module link|transclusion count|fetch}}
==Redirects==
{{columns-list|colwidth=15em|
*{{tl|heavilytranscluded}}
*{{tl|high risk}}
*{{tl|high-risk}}
*{{tl|high use}}
*{{tl|risky template}}
}}
== See also ==
* {{tl|Intricate template}} – for templates that are complex, using less obvious techniques
* {{tl|Interconnected template}} – for templates that have dependencies on others, or on config files, subpages, dynamic doc, etc.
* {{tl|pp-template}} – protection template that usually is put on high-risk templates
* {{tl|Used in system}} – for templates used in the Wikipedia user interface
* [[Wikipedia:High-risk templates]]
* [[Wikipedia:Template sandbox and test cases]]
== Template counters ==
* [[toollabs:templatecount/]] – easy to use, returns current (real time) transclusion count for a template
* <span class="plainlinks">[{{fullurl:Special:MostLinkedTemplates|limit=500}} Special:MostLinkedTemplates]</span> – special page search for most transcluded templates
* [[Special:PrefixIndex/Module:Transclusion_count/data/]] – template count data used by this template that is broken down by first letter of template and rounded to two or three significant figures, and updated weekly
* [[Wikipedia:Database reports/Templates transcluded on the most pages]] – lists the 1000 most transcluded templates, not updated since November 2018
<!-- * [[tools:~dispenser/cgi-bin/embeddedincount.py]] – Seems to lack human interface, probably meant for programs to call. (not working anymore) -->
<includeonly>{{sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Documentation header templates]]
}}</includeonly>
== TemplateData == <!-- 'system' parameter is undocumented and probably should not be here. -->
<templatedata>
{
"params": {
"1": {
"label": "number of transclusions (DEPRECATED)",
"description": "either a static number of times the template has been transcluded, or the word \"risk\" (without quotes) to display \"a very large number of\" instead of the actual value.",
"type": "string",
"suggestedvalues": [
"risk"
],
"deprecated": "This value will be ignored, if transclusion data is available for the current page."
},
"2": {
"label": "discussion page, or use + notation",
"description": "The second parameter is overloaded. It will cause the number of transclusions to display as \"#,###+\" instead of \"approximately #,###\" when set equal to \"yes\" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, 2=WP:VPT will insert a link to WP:VPT)",
"type": "string",
"default": " ",
"autovalue": " "
},
"info": {
"label": "Extra information",
"description": "When set to non-blank, will insert the value of this parameter into the template text.",
"type": "content"
},
"demo": {
"label": "template name (intended for demo purposes)",
"description": "Will use the transclusion count for the template at [[Template:<Template_name>]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in Special:PrefixIndex/Module:Transclusion_count/data/.",
"type": "string"
},
"form": {
"label": "form for this template",
"description": "When set to \"editnotice\", will display the message using {{editnotice}} instead of {{ombox}}.",
"type": "string",
"suggestedvalues": [
"editnotice",
" "
]
},
"expiry": {
"label": "Expiry for {{editnotice}}",
"description": "if `form=editnotice`, this will set the expiry parameter of the editnotice.",
"type": "date"
},
"system": {}
},
"description": "This is the {{high-use}} message box.\n\nIt is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to risk, then a stronger wording is given.\n\nNote: It is normal that some of the links in the message box are red. ",
"format": "inline"
}
</templatedata>
92e6eceabb8cc4343fdb7d49a052fa3b3a473819
Module:High-use
828
99
116
2023-10-08T05:30:51Z
Silentg
2
Created page with "local p = {} -- _fetch looks at the "demo" argument. local _fetch = require('Module:Transclusion_count').fetch local yesno = require('Module:Yesno') function p.num(frame, count) if count == nil then if yesno(frame.args['fetch']) == false then if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end else count = _fetch(frame) end end -- Build output string local return_value = "" if count == nil then if frame.args[1] == "risk" then..."
Scribunto
text/plain
local p = {}
-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count').fetch
local yesno = require('Module:Yesno')
function p.num(frame, count)
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
-- Build output string
local return_value = ""
if count == nil then
if frame.args[1] == "risk" then
return_value = "a very large number of"
else
return_value = "many"
end
else
-- Use 2 significant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if count >= 100000 then
sigfig = 3
end
-- Prepare to round to appropriate number of sigfigs
local f = math.floor(math.log10(count)) - sigfig + 1
-- Round and insert "approximately" or "+" when appropriate
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
-- Round down
return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
else
-- Round to nearest
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
end
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
if percent >= 1 then
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
end
end
end
return return_value
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p.risk(frame)
local return_value = ""
if frame.args[1] == "risk" then
return_value = "risk"
else
local count = _fetch(frame)
if count and count >= 100000 then return_value = "risk" end
end
return return_value
end
function p.text(frame, count)
-- Only show the information about how this template gets updated if someone
-- is actually editing the page and maybe trying to update the count.
local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" or title.subpageText == "sandbox" then
title = title.basePageTitle
end
local systemMessages = frame.args['system']
if frame.args['system'] == '' then
systemMessages = nil
end
-- This retrieves the project URL automatically to simplify localiation.
local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p.num(frame, count))
local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used ';
if systemMessages then
used_on_text = used_on_text .. systemMessages ..
((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local sandbox_text = ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
title.fullText, title.fullText,
mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
)
local infoArg = frame.args["info"] ~= "" and frame.args["info"]
if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
if infoArg then
info = info .. "<br />" .. infoArg
end
sandbox_text = info .. '<br /> To avoid major disruption' ..
(count and count >= 100000 and ' and server load' or '') ..
', any changes should be tested in the ' .. sandbox_text ..
'The tested changes can be added to this page in a single edit. '
else
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
'hanges may be widely noticed. Test changes in the ' .. sandbox_text
end
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"])
else
discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
end
return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text
end
function p.main(frame)
local count = nil
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local type_param = "style"
local epilogue = ''
if frame.args['system'] and frame.args['system'] ~= '' then
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
type_param = "content"
local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
local categorise = (nocat == '' or not yesno(nocat))
if categorise then
epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
end
elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
type_param = "content"
end
if frame.args["form"] == "editnotice" then
return frame:expandTemplate{
title = 'editnotice',
args = {
["image"] = image,
["text"] = p.text(frame, count),
["expiry"] = (frame.args["expiry"] or "")
}
} .. epilogue
else
return require('Module:Message box').main('ombox', {
type = type_param,
image = image,
text = p.text(frame, count),
expiry = (frame.args["expiry"] or "")
}) .. epilogue
end
end
return p
134551888e066954a89c109d2faa8af71a4454a4
Module:High-use/doc
828
100
117
2023-10-08T05:32:10Z
Silentg
2
Created page with "{{Module rating|release}} {{High-use|demo=Module:{{ROOTPAGENAME}}}} {{Lua|Module:Effective protection level|Module:Message box|Module:Transclusion count|Module:Yesno}} Implements {{tl|High-use}}. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == {{Mlx|High-use|main|1{{=}}''number of transclusions''|2{{=}}''discussion page, or use + notation''|all-pages{{=}}|info{..."
wikitext
text/x-wiki
{{Module rating|release}}
{{High-use|demo=Module:{{ROOTPAGENAME}}}}
{{Lua|Module:Effective protection level|Module:Message box|Module:Transclusion count|Module:Yesno}}
Implements {{tl|High-use}}. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available.
== Usage ==
{{Mlx|High-use|main|1{{=}}''number of transclusions''|2{{=}}''discussion page, or use + notation''|all-pages{{=}}|info{{=}}|demo{{=}}|form{{=}}|expiry{{=}}}}
* ''<code>number of transclusions</code>'': The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored if transclusion data is available for the current page.
* ''<code>discussion page, or use + notation</code>'': The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]),
* {{para|all-pages|yes}}: Will also output what percentage of all pages use the template. This should only be used for very highly transcluded templates, and the percentage will only display if its greater than 1%.
* {{para|info|''extra information''}}: When set to non-blank, will insert ''extra information'' into the template text if the template has more than 10,000 transclusions or parameter 1 is set to "risk".
* {{para|demo|''Template_name''}}: Will use the transclusion count for the template at [[Template:Template_name]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]].
* {{para|form}}: When set to "editnotice", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}.
* {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}.
* {{para|system|''in system messages''}}: if set, this module looks like {{tl|Used in system}}. Use that template directly as it performs some checks.
* {{para|fetch}}: if set to false, the module will not attempt to fetch transclusion counts using [[:Module:Transclusion count]]
=== Other functions ===
; num
: Produces the text and and link to toolforge surrounding the amount of transclusions.
; risk
: With this function, if <code>risk</code> is passed into the first unnamed parameter, or there are more than 100k transclusions, this will return <code>risk</code>.
; text
: Returns the body text of this template, with nil or a number of transclusions.
e00df5ef600f39151d739e7b48c32a5f218e7949
Module:Transclusion count
828
101
118
2023-10-08T05:33:21Z
Silentg
2
Created page with "local p = {} function p.fetch(frame) local template = nil local return_value = nil -- Use demo parameter if it exists, otherswise use current template name local namespace = mw.title.getCurrentTitle().namespace if frame.args["demo"] and frame.args["demo"] ~= "" then template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","") elseif namespace == 10 then -- Template namespace template = mw.title.getCurrentTitle().text elseif namespace == 828 then -- Modu..."
Scribunto
text/plain
local p = {}
function p.fetch(frame)
local template = nil
local return_value = nil
-- Use demo parameter if it exists, otherswise use current template name
local namespace = mw.title.getCurrentTitle().namespace
if frame.args["demo"] and frame.args["demo"] ~= "" then
template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","")
elseif namespace == 10 then -- Template namespace
template = mw.title.getCurrentTitle().text
elseif namespace == 828 then -- Module namespace
template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
end
-- If in template or module namespace, look up count in /data
if template ~= nil then
namespace = mw.title.new(template, "Template").namespace
if namespace == 10 or namespace == 828 then
template = mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
template = mw.ustring.gsub(template, "/sandbox$", "") -- strip /sandbox from end
local index = mw.ustring.sub(mw.title.new(template).text,1,1)
local status, data = pcall(function ()
return(mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other")))
end)
if status then
return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
end
end
end
-- If database value doesn't exist, use value passed to template
if return_value == nil and frame.args[1] ~= nil then
local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
if arg1 and arg1 ~= '' then
return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
end
end
return return_value
end
-- Tabulate this data for [[Wikipedia:Database reports/Templates transcluded on the most pages]]
function p.tabulate(frame)
local list = {}
for i = 65, 91 do
local data = mw.loadData('Module:Transclusion count/data/' .. ((i == 91) and 'other' or string.char(i)))
for name, count in pairs(data) do
table.insert(list, {mw.title.new(name, "Template").fullText, count})
end
end
table.sort(list, function(a, b)
return (a[2] == b[2]) and (a[1] < b[1]) or (a[2] > b[2])
end)
local lang = mw.getContentLanguage();
for i = 1, #list do
list[i] = ('|-\n| %d || [[%s]] || %s\n'):format(i, list[i][1]:gsub('_', ' '), lang:formatNum(list[i][2]))
end
return table.concat(list)
end
return p
000ef6bcbf7b66e727870b0c300c4009da300513
Module:Transclusion count/doc
828
102
119
2023-10-08T05:36:58Z
Silentg
2
Created page with "{{Module rating |beta}} {{high-use}} Fetches usage data for highly-transcluded templates. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|fetch|''number of transclusions''|''use + notation''|all-pages=|demo=}}</code> * ''<code>number of transclusions</code>'': is a static number of times the template has been tr..."
wikitext
text/x-wiki
{{Module rating |beta}}
{{high-use}}
Fetches usage data for highly-transcluded templates. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available.
== Usage ==
<code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|fetch|''number of transclusions''|''use + notation''|all-pages=|demo=}}</code>
* ''<code>number of transclusions</code>'': is a static number of times the template has been transcluded, to use when values cannot be read from the database. This value will be ignored if transclusion data is available for the current page.
* <code>demo=''Template_name''</code>: will use the transclusion count for the template at [[Template:Template_name]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]].
<code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|tabulate}}</code>
* Used to generate [[Wikipedia:Database reports/Templates transcluded on the most pages]].
== Notices ==
* The number of transclusion count is generated via subpages of [[Special:PrefixIndex/Module:Transclusion count/data/|Module:Transclusion count/data]] when is avaliable and is automatically updated via a bot.
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
a0830db7362232d64780cb4dd940adaffc544c08
Template:Lua
10
103
120
2023-10-08T05:38:24Z
Silentg
2
Created page with "<includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude> {{Lua|Module:Lua banner}} {{documentation}} <!-- Categories go on the /doc subpage and interwikis go on Wikidata. --> </noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude>
{{Lua|Module:Lua banner}}
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
dba3962144dacd289dbc34f50fbe0a7bf6d7f2f7
Template:Lua/doc
10
104
121
2023-10-08T05:38:58Z
Silentg
2
Created page with "{{Documentation subpage}} {{Template shortcut|Lua talk}} {{Lua|Module:Lua banner}} <!-- Categories go at the bottom of this page, and interwikis go on Wikidata. --> {{for|template to indicate [[Luba-Kasai language]] words|Template:Lang-lua}} This template is used to indicate that a template uses one or more [[Lua (programming language)|Lua]] modules (pages in the <code>Module:</code> namespace). It is placed at the top of the template's /doc page. It automatically adds a..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{Template shortcut|Lua talk}}
{{Lua|Module:Lua banner}}
<!-- Categories go at the bottom of this page, and interwikis go on Wikidata. -->
{{for|template to indicate [[Luba-Kasai language]] words|Template:Lang-lua}}
This template is used to indicate that a template uses one or more [[Lua (programming language)|Lua]] modules (pages in the <code>Module:</code> namespace). It is placed at the top of the template's /doc page. It automatically adds a floating right notification box, and it adds the template to [[:Category:Lua-based templates]] or to one of its subcategories.
== Usage ==
; Basic : {{tlx|Lua|''module name''}}
; All parameters : {{tlx|Lua|''module 1''|''module 2''|''module 3''|...|category{{=}}''custom category''|nocat{{=}}''true''}}
The first module name is required.
== Examples ==
* {{tlx|Lua|Module:Example}}
{{Lua|Module:Example|nocat=true}}
{{clear}}
* {{tlx|Lua|Module:Example|Module:Example}}
{{Lua|Module:Example|Module:Example|nocat=true}}
{{clear}}
* {{tlx|Lua}}
{{Lua|nocat=true}}
{{clear}}
== Categorisation ==
===Template category===
This template adds pages to [[:Category:Lua-based templates]] if the page is in the template namespace, and it is not on any of the subpages /doc, /sandbox, /sandbox2 or /testcases. You can specify a different category with the {{para|category}} parameter, e.g. {{para|category|Lua String-based templates}}.
Some modules have a default category other than [[:Category:Lua-based templates]]:
* [[Module:String]] has the default category [[:Category:Templates based on the String Lua module]].
* [[Module:Math]] has the default category [[:Category:Templates based on the Math Lua module]].
* [[Module:BaseConvert]] has the default category [[:Category:Templates based on the BaseConvert Lua module]].
* [[Module:Citation/CS1]] has the default category [[:Category:Templates based on the Citation/CS1 Lua module]].
===Error category===
If no modules are specified, the transcluded page will be added to [[:Category:Lua templates with errors]].
===Category suppression===
To suppress all categorisation, use {{para|nocat|true}}. (As well as "true", the values "yes", "y", and "1" will also work.)
== TemplateData ==
{{Format TemplateData|TNT=Lua banner}}
== See also ==
* [[Wikipedia:Lua]]
* {{tl|module rating}}
* {{tl|Uses TemplateStyles}}
<includeonly>{{Sandbox other|
| <!-- Categories go here, and interwikis go on Wikidata. -->
[[Category:Lua-based templates| ]]
[[Category:Template namespace templates]]
}}</includeonly>
a0a237a34ba98213650e4c11064bd4c8f944fcc6
Module:Lua banner
828
105
122
2023-10-08T05:41:06Z
Silentg
2
Created page with "-- This module implements the {{lua}} template. local yesno = require('Module:Yesno') local mList = require('Module:List') local mTableTools = require('Module:TableTools') local mMessageBox = require('Module:Message box') local p = {} function p.main(frame) local origArgs = frame:getParent().args local args = {} for k, v in pairs(origArgs) do v = v:match('^%s*(.-)%s*$') if v ~= '' then args[k] = v end end return p._main(args) end function p._main(args)..."
Scribunto
text/plain
-- This module implements the {{lua}} template.
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local p = {}
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
function p._main(args)
local modules = mTableTools.compressSparseArray(args)
local box = p.renderBox(modules)
local trackingCategories = p.rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args, modules)
return box .. trackingCategories
end
function p.renderBox(modules)
local boxArgs = {}
if #modules < 1 then
boxArgs.text = '<strong class="error">Error: no modules specified</strong>'
else
local moduleLinks = {}
for i, module in ipairs(modules) do
moduleLinks[i] = string.format('[[:%s]]', module)
local maybeSandbox = mw.title.new(module .. '/sandbox')
if maybeSandbox.exists then
moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|sandbox]])', maybeSandbox.fullText)
end
end
local moduleList = mList.makeList('bulleted', moduleLinks)
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" then
title = title.basePageTitle
end
if title.contentModel == "Scribunto" then
boxArgs.text = 'This module depends on the following other modules:' .. moduleList
else
boxArgs.text = 'This template uses [[Wikipedia:Lua|Lua]]:\n' .. moduleList
end
end
boxArgs.type = 'notice'
boxArgs.small = true
boxArgs.image = '[[File:Lua-Logo.svg|30px|alt=|link=]]'
return mMessageBox.main('mbox', boxArgs)
end
function p.rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args, modules, titleObj)
if yesno(args.nocat) then
return ''
end
local cats = {}
-- Error category
if #modules < 1 then
cats[#cats + 1] = 'Lua templates with errors'
end
-- Lua templates category
titleObj = titleObj or mw.title.getCurrentTitle()
local subpageBlacklist = {
doc = true,
sandbox = true,
sandbox2 = true,
testcases = true
}
if not subpageBlacklist[titleObj.subpageText] then
local protCatName
if titleObj.namespace == 10 then
local category = args.category
if not category then
local categories = {
['Module:String'] = 'Templates based on the String Lua module',
['Module:Math'] = 'Templates based on the Math Lua module',
['Module:BaseConvert'] = 'Templates based on the BaseConvert Lua module',
['Module:Citation/CS1'] = 'Templates based on the Citation/CS1 Lua module'
}
category = modules[1] and categories[modules[1]]
category = category or 'Lua-based templates'
end
cats[#cats + 1] = category
protCatName = "Templates using under-protected Lua modules"
elseif titleObj.namespace == 828 then
protCatName = "Modules depending on under-protected modules"
end
if not args.noprotcat and protCatName then
local protLevels = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
local currentProt
if titleObj.id ~= 0 then
-- id is 0 (page does not exist) if am previewing before creating a template.
currentProt = titleObj.protectionLevels["edit"][1]
end
if currentProt == nil then currentProt = 0 else currentProt = protLevels[currentProt] end
for i, module in ipairs(modules) do
if module ~= "WP:libraryUtil" then
local moduleProt = mw.title.new(module).protectionLevels["edit"][1]
if moduleProt == nil then moduleProt = 0 else moduleProt = protLevels[moduleProt] end
if moduleProt < currentProt then
cats[#cats + 1] = protCatName
break
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
return p
81a5d855c66ec54c6f92c66444cc71df24f2867c
Module:Lua banner/doc
828
106
123
2023-10-08T05:52:20Z
Silentg
2
Created page with "{{high use}} {{Lua|Module:Yesno|Module:List|Module:TableTools|Module:Message box}} This module implements the {{tl|lua}} template. == Usage from wikitext == This module cannot be used directly from wikitext. It can only be used through the {{tl|lua}} template. Please see the template page for documentation. == Usage from Lua modules == To use this module from other Lua modules, first load the module. <syntaxhighlight lang="lua"> local mLuaBanner = require('Module:Lu..."
wikitext
text/x-wiki
{{high use}}
{{Lua|Module:Yesno|Module:List|Module:TableTools|Module:Message box}}
This module implements the {{tl|lua}} template.
== Usage from wikitext ==
This module cannot be used directly from wikitext. It can only be used through the {{tl|lua}} template. Please see the template page for documentation.
== Usage from Lua modules ==
To use this module from other Lua modules, first load the module.
<syntaxhighlight lang="lua">
local mLuaBanner = require('Module:Lua banner')
</syntaxhighlight>
You can then generate a side box using the _main function.
<syntaxhighlight lang="lua">
mLuaBanner._main(args)
</syntaxhighlight>
The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the {{tl|lua}} template documentation.
== Tracking category ==
* {{clc|Lua templates with errors}}
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Modules that add a tracking category]]
}}</includeonly>
864df985eac89c7dc7d6168d9235ff11b9f13b47
Module:List
828
107
124
2023-10-08T05:53:06Z
Silentg
2
Created page with "local libUtil = require('libraryUtil') local checkType = libUtil.checkType local mTableTools = require('Module:TableTools') local p = {} local listTypes = { ['bulleted'] = true, ['unbulleted'] = true, ['horizontal'] = true, ['ordered'] = true, ['horizontal_ordered'] = true } function p.makeListData(listType, args) -- Constructs a data table to be passed to p.renderList. local data = {} -- Classes and TemplateStyles data.classes = {} data.templatestyles = ''..."
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.renderTrackingCategories(args)
local isDeprecated = false -- Tracks deprecated parameters.
for k, v in pairs(args) do
k = tostring(k)
if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
isDeprecated = true
break
end
end
local ret = ''
if isDeprecated then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
end
return ret
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
local trackingCategories = p.renderTrackingCategories(args)
return list .. trackingCategories
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
7a4f36a6e9cd56370bdd8207d23694124821dc1a
Module:List/doc
828
108
125
2023-10-08T05:53:44Z
Silentg
2
Created page with "{{used in system|in [[MediaWiki:Citethispage-content]]}} {{module rating|protected}} {{Lua|Module:TableTools|Module:Arguments}} {{Uses TemplateStyles|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module outputs various kinds of lists. At present, it supports bulleted lists, unbulleted lists, horizontal lists, ordered lists (numbered or alphabetical), and horizontal ordered lists. It allows for easy css styling of the list or of the individual list items..."
wikitext
text/x-wiki
{{used in system|in [[MediaWiki:Citethispage-content]]}}
{{module rating|protected}}
{{Lua|Module:TableTools|Module:Arguments}}
{{Uses TemplateStyles|Template:Plainlist/styles.css|Template:Hlist/styles.css}}
This module outputs various kinds of lists. At present, it supports bulleted lists, unbulleted lists, horizontal lists, ordered lists (numbered or alphabetical), and horizontal ordered lists. It allows for easy css styling of the list or of the individual list items.
== Usage ==
=== Quick usage ===
{{pre|<nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function''<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...<nowiki>}}</nowiki>}}
=== All parameters ===
{{pre|
<nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function''
<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...
<nowiki>|start = </nowiki>''start number for ordered lists''
<nowiki>|type = </nowiki>''type of numbering for ordered lists''
<nowiki>|list_style_type = </nowiki>''type of marker for ordered lists (uses CSS)''
<nowiki>|class = </nowiki>''class''
<nowiki>|style = </nowiki>''style''
<nowiki>|list_style = </nowiki>''style for the list''
<nowiki>|item_style = </nowiki>''style for all list items''
<nowiki>|item1_style = </nowiki>''style for the first list item''<nowiki> |item2_style = </nowiki>''style for the second list item''<nowiki> |</nowiki>...
<nowiki>|item1_value = </nowiki>''value for the first list item''<nowiki> |item2_value = </nowiki>''value for the second list item''<nowiki> |</nowiki>...
<nowiki>|indent = </nowiki>''indent for horizontal lists''
<nowiki>}}</nowiki>
}}
=== Arguments passed from parent template ===
{{pre|<nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function''<nowiki>}}</nowiki>}}
=== Functions ===
{| class="wikitable"
|-
! Function name
! Produces
! Example output
! Template using the function
|-
| <code>bulleted</code>
| Bulleted lists
| {{#invoke:list|bulleted|First item|Second item|Third item}}
| {{tlx|bulleted list}}
|-
| <code>unbulleted</code>
| Unbulleted lists
| {{#invoke:list|unbulleted|First item|Second item|Third item}}
| {{tlx|unbulleted list}}
|-
| <code>horizontal</code>
| Horizontal bulleted lists
| {{#invoke:list|horizontal|First item|Second item|Third item}}
| {{tlx|hlist}}
|-
| <code>ordered</code>
| Ordered lists (numbered lists and alphabetical lists)
| {{#invoke:list|ordered|First item|Second item|Third item}}
| {{tlx|ordered list}}
|-
| <code>horizontal_ordered</code>
| Horizontal ordered lists
| {{#invoke:list|horizontal_ordered|First item|Second item|Third item}}
| {{tlx|horizontal ordered list}}
|}
== Parameters ==
* Positional parameters (<code>1</code>, <code>2</code>, <code>3</code>...) - these are the list items. If no list items are present, the module will output nothing.
* <code>start</code> - sets the start item for ordered lists. This can be a start number for numbered lists, or a start letter for alphabetical lists. Horizontal ordered lists only support numbers.
* <code>type</code> - the type of marker used in ordered lists. Possible values are "1" for numbers (the default), "A" for uppercase letters, "a" for lowercase letters, "I" for uppercase [[Roman numerals]], and "i" for lowercase Roman numerals. Not supported in horizontal ordered lists. See also the <code>list_style_type</code> parameter.
* <code>list_style_type</code> - the type of marker used in ordered lists. This uses CSS styling, and has more types available than the <code>type</code> parameter, which uses an [[html attribute]]. Possible values are listed at [https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type MDN's list-style-type page]. Support may vary by browser. <code>list-style-type</code> is an alias for this parameter.
* <code>class</code> - a custom class for the {{tag|div}} tags surrounding the list, e.g. <code>plainlinks</code>.
* <code>style</code> - a custom css style for the {{tag|div}} tags surrounding the list, e.g. <code>font-size: 90%;</code>.
* <code>list_style</code> - a custom css style for the list itself. The format is the same as for the {{para|style}} parameter.
* <code>item_style</code> - a custom css style for all of the list items (the {{tag|li}} tags). The format is the same as for the {{para|style}} parameter.
* <code>item1_style</code>, <code>item2_style</code>, <code>item3_style</code>... - custom css styles for each of the list items. The format is the same as for the {{para|style}} parameter.
* <code>item1_value</code>, <code>item2_value</code>, <code>item3_value</code>... - custom value for the given list item. List items following the one given will increment from the specified value. The value should be a positive integer. (Note that this option only has an effect on ordered lists.)
* <code>indent</code> - this parameter indents the list, for horizontal and horizontal ordered lists only. The value must be a number, e.g. <code>2</code>. The indent is calculated in [[Em (typography)|em]], and is 1.6 times the value specified. If no indent is specified, the default is zero.
== Examples ==
=== Bulleted lists ===
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item}}</nowiki></code>
| {{#invoke:list|bulleted|First item|Second item|Third item}}
|-
| <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item|item_style=color:blue;}}</nowiki></code>
| {{#invoke:list|bulleted|First item|Second item|Third item|item_style=color:blue;}}
|-
| <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki></code>
| {{#invoke:list|bulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}
|}
=== Unbulleted lists ===
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item}}</nowiki></code>
| {{#invoke:list|unbulleted|First item|Second item|Third item}}
|-
| <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item|item_style=color:blue;}}</nowiki></code>
| {{#invoke:list|unbulleted|First item|Second item|Third item|item_style=color:blue;}}
|-
| <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki></code>
| {{#invoke:list|unbulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}
|}
=== Horizontal lists ===
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{#invoke:list|horizontal|First item|Second item|Third item}}</nowiki></code>
| {{#invoke:list|horizontal|First item|Second item|Third item}}
|-
| <code><nowiki>{{#invoke:list|horizontal|First item|Second item|Third item|indent=2}}</nowiki></code>
| {{#invoke:list|horizontal|First item|Second item|Third item|indent=2}}
|}
=== Ordered lists ===
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item}}</nowiki></code>
| {{#invoke:list|ordered|First item|Second item|Third item}}
|-
| <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|start=3}}</nowiki></code>
| {{#invoke:list|ordered|First item|Second item|Third item|start=3}}
|-
| Lowercase [[Roman numerals]]: <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|type=i}}</nowiki></code>
| {{#invoke:list|ordered|First item|Second item|Third item|type=i}}
|-
| Lowercase [[Greek alphabet]]: <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|list_style_type=lower-greek}}</nowiki></code>
| {{#invoke:list|ordered|First item|Second item|Third item|list_style_type=lower-greek}}
|}
=== Horizontal ordered lists ===
{| class="wikitable"
! Code !! Result
|-
| <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item}}</nowiki></code>
| {{#invoke:list|horizontal_ordered|First item|Second item|Third item}}
|-
| <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item|start=3}}</nowiki></code>
| {{#invoke:list|horizontal_ordered|First item|Second item|Third item|start=3}}
|-
| <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item|indent=2}}</nowiki></code>
| {{#invoke:list|horizontal_ordered|First item|Second item|Third item|indent=2}}
|}
== Tracking/maintenance category ==
* {{clc|List templates with deprecated parameters}}
== See also ==
* [[Module:Separated entries]]
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | |
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Modules that add a tracking category]]
}}</includeonly>
b4031c1ae9765885d3ce8d96c78c8557f6887aa1
Template:Parameter names example
10
109
126
2023-10-08T05:55:06Z
Silentg
2
Created page with "<includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude> {{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude>
{{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
256a11b9ae7ac7e492b3d9de86ade1ffa96bffd1
Template:Parameter names example/doc
10
110
127
2023-10-08T05:55:30Z
Silentg
2
Created page with "{{Documentation subpage}} <!----Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])----> {{Lua|Module:Parameter names example}} {{Template redirect|Generic template demo|Pnex}} {{tl|Parameter names example}} – or, alternatively, {{tl|Generic template demo}} – is intended to assist [[Wikipedia:Template documentation|template documentation]] by producing a generic instance of the template that u..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!----Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])---->
{{Lua|Module:Parameter names example}}
{{Template redirect|Generic template demo|Pnex}}
{{tl|Parameter names example}} – or, alternatively, {{tl|Generic template demo}} – is intended to assist [[Wikipedia:Template documentation|template documentation]] by producing a generic instance of the template that uses [[Help:Templates#Parameters|parameters' names]] as those parameters' values.
{{clear}}
==Example==
The example opposite for {{tl|Infobox}}, for instance, was produced by:
{{Parameter names example |_template=Infobox |title |above |subheader |subheader2 |image |caption |header1 |label2 |data2 |label3 |data3 |header4 |data5 |data6 |below}}
<pre style="overflow:auto;">
{{Parameter names example
|_template=Infobox
|title |above |subheader |subheader2 |image |caption
|header1 |label2 |data2 |label3 |data3 |header4
|data5 |data6 |below
}}
</pre>
==Usage notes==
When {{tlf|Parameter names example}} is used on an immediate subpage of its target template – e.g. on the target template's /doc page – its own {{para|_template}} parameter identifying the target template may be omitted. In other words, the code above, if used on Template:Infobox/''page'' (where ''page'' could be "doc", "testcases", etc.), would become:
<pre style="overflow:auto;">
{{Parameter names example
|title |above |subheader |subheader2 |image |caption
|header1 |label2 |data2 |label3 |data3 |header4
|data5 |data6 |below
}}
</pre>
One exception to this is the "sandbox" subpage. If the module is called from a page ending in "/sandbox", it uses that page to generate the template output, not the base page. To override this behaviour you can specify the {{para|_template}} parameter explicitly.
The formatting of the parameter names can be changed with the {{para|_display}} parameter. By default, the parameter names are shown in triple braces (the [[m:Help:Templates#Parameters|parameter standard]], e.g. {{{name}}}{{thin space}}), but if {{para|_display|italics}} or {{para|_display|italic}} is set, they are shown in italics.
A custom value for a parameter may be supplied by using {{para|[parameter name]|[value]}} in place of <code>|[parameter name]</code>. Any formatting for such a value – including, for instance, italics – must be supplied as part of the value (e.g. {{para|parameter|<nowiki>''value''<br/></nowiki>}}). Custom values cannot be used for parameters whose names begin with an underscore ("_").
== See also ==
* [[Wikipedia:Template documentation]]
* [[Template:Parameters]] and [[Module:Parameters]] – generates a list of parameter names for a given template
<includeonly>{{Sandbox other|
| <!----Categories below this line, please; interwikis at Wikidata---->
[[Category:Wikipedia utility templates]]
[[Category:Template namespace templates]]
[[Category:Documentation assistance templates]]
}}</includeonly>
44fe789b86304de50c1d568d13787c8eae3655c5
Module:Parameter names example
828
111
128
2023-10-08T05:56:05Z
Silentg
2
Created page with "-- This module implements {{parameter names example}}. local p = {} local function makeParam(s) local lb = '{' local rb = '}' return lb:rep(3) .. s .. rb:rep(3) end local function italicize(s) return "''" .. s .. "''" end local function plain(s) return s end function p._main(args, frame) -- Find how we want to format the arguments to the template. local formatFunc if args._display == 'italics' or args._display == 'italic' then formatFunc = italic..."
Scribunto
text/plain
-- This module implements {{parameter names example}}.
local p = {}
local function makeParam(s)
local lb = '{'
local rb = '}'
return lb:rep(3) .. s .. rb:rep(3)
end
local function italicize(s)
return "''" .. s .. "''"
end
local function plain(s)
return s
end
function p._main(args, frame)
-- Find how we want to format the arguments to the template.
local formatFunc
if args._display == 'italics' or args._display == 'italic' then
formatFunc = italicize
elseif args._display == 'plain' then
formatFunc = plain
else
formatFunc = makeParam
end
-- Build the table of template arguments.
local targs = {}
for k, v in pairs(args) do
if type(k) == 'number' then
targs[v] = formatFunc(v)
elseif not k:find('^_') then
targs[k] = v
end
end
--targs['nocat'] = 'yes';
--targs['categories'] = 'no';
--targs['demo'] = 'yes';
-- Find the template name.
local template
if args._template then
template = args._template
else
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.prefixedText:find('/sandbox$') then
template = currentTitle.prefixedText
else
template = currentTitle.basePageTitle.prefixedText
end
end
-- Call the template with the arguments.
frame = frame or mw.getCurrentFrame()
local success, result = pcall(
frame.expandTemplate,
frame,
{title = template, args = targs}
)
if success then
return result
else
return ''
end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Parameter names example'
})
return p._main(args, frame)
end
return p
fdf94fb7a5dc1fabf118d60488a02f1e65b0df24
Module:Parameter names example/doc
828
112
129
2023-10-08T05:56:55Z
Silentg
2
Created page with "{{Pnex |_template=Infobox |title |above |subheader |image |caption |header1 |label2 |data2 |label3 |data3 |below}} This module implements {{tl|Parameter names example}} (also known as {{tl|Generic template demo}}). It creates a template demonstration such as that shown opposite. Please see [[Template:Parameter names example|the template page]] for full documentation. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis a..."
wikitext
text/x-wiki
{{Pnex |_template=Infobox |title |above |subheader |image |caption
|header1 |label2 |data2 |label3 |data3 |below}}
This module implements {{tl|Parameter names example}} (also known as {{tl|Generic template demo}}). It creates a template demonstration such as that shown opposite. Please see [[Template:Parameter names example|the template page]] for full documentation.
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox |
| <!-- Categories below this line, please; interwikis at Wikidata -->
}}</includeonly>
316e614070bb689ba87e0c034b05e76834321f41
Template:Strong
10
113
130
2023-10-08T05:58:16Z
Silentg
2
Created page with "<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude>"
wikitext
text/x-wiki
<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude>
{{documentation}}
<!-- Add cats and interwikis to the /doc subpage, not here! -->
</noinclude>
a6c6d3b520e2018e19376e2f0e1a72801336d1df
Template:Strong/doc
10
114
131
2023-10-08T05:58:35Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE --> == Purpose == The {{Strong|Strong template}} makes it faster and easier to apply the {{tag|strong}} {{strong|importance, seriousness, or urgency}} [[HTML element]] to text, and more importantly to indicate to human editors and [[Wikipedia:Bots|Wikipedia bot]]s they should not use <code><nowiki>'''...'''</nowiki></code> or {{tag|b}} typographic boldfacing to replace the in..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE -->
== Purpose ==
The {{Strong|Strong template}} makes it faster and easier to apply the {{tag|strong}} {{strong|importance, seriousness, or urgency}} [[HTML element]] to text, and more importantly to indicate to human editors and [[Wikipedia:Bots|Wikipedia bot]]s they should not use <code><nowiki>'''...'''</nowiki></code> or {{tag|b}} typographic boldfacing to replace the intentional and [[Semantic Web|semantically meaningful]] {{tag|strong|open}}. The {{tag|strong}} element is usually rendered visually in a bold (heavy) typeface by default on graphical browsers, but can be parsed and acted upon in customizable ways with [[Style sheet (web development)|style sheets]], [[Application software|apps]], and text-to-speech [[screen reader]]s. It is [[semantic markup]], i.e. markup that conveys meaning or context, not just visual appearance.
Simple boldfacing (<code><nowiki>'''...'''</nowiki></code> or {{tag|b}}) is purely typographic and is semantically meaningless. Boldface ({{tag|b}}) is most often used for headings, but has a few other uses (such as for book or film titles and the like, which are usually italicized, when they appear in an already-italicized passage). The average reader, and average editor, do not and need not care about this distinction most of the time, but it can be important and editors who understand it can use this template as a baseline insurance against accidental or uninformed replacement by bots and human editors, as well as to add [[web accessibility]].
== Usage ==
:{{tlnull|strong|<var>important text</var>}}
or, if the important text contains an equals sign:
:{{tlnull|strong|'''1{{=}}'''<var>important text</var>}}
These both render as:
:{{strong|important text}}
This template puts intentional and explicit {{tag|strong}} (importance, seriousness, or urgency) HTML markup around the text provided as the first parameter. It is safest to always use the {{para|1}} syntax.
===Optional parameters===
Advanced HTML values can be passed through the template to the HTML code:
* {{para|role}} takes a WAI-ARIA role; adds <code>role="<var>rolename</var>"</code> to the HTML code
* {{para|class}} takes a class name (or multiple class names, separated by spaces); adds <code>class="<var>classname[s]</var>"</code> to the HTML code
* {{para|style}} takes inline CSS input; adds <code>style="<var>CSS directive[s]</var>"</code> to the HTML code
* {{para|id}} takes a valid, unique HTML id (must begin with an alphabetic letter); adds <code>id="<var>name</var>"</code> to the HTML code
* {{para|title}} takes text, which cannot be marked up in any way, and displays it as a pop-up "tooltip" when the cursor hovers over the {{tnull|strong}} span
===Use cases===
{{more|Wikipedia:WikiProject Usability/Scannability}}
This template is made to mark important words or phrases in a text, in a way that is (unlike simply boldfacing it) [[Semantic markup|semantically meaningful markup]]. With this technique, the important text strongly stands out from the rest in most if not all visual browsers and some text-to-speech screen readers (which usually ignore purely typographic boldfacing), and can also be parsed by user agents and other software as definitively indicating importance, not just some typographic boldface effect for appearance's sake. It should therefore only be used very sparingly in articles to highlight the most important words or phrases in the entire article (and, rarely in encyclopedic writing, to represent relative importance). Use of this template has a strong effect on {{Linktext|scannability}}, drawing the eye from elsewhere on the page to words marked up with the template.
Typical uses on Wikipedia:
* In the [[WP:LEAD|lead section of an article]], the article's title can be marked with {{tnull|strong}}. Example: "The {{strong|soma}} is the bulbous end of a neuron." {{As of|July 2022}}, there is no consensus either for or against this use.<ref>The style guidelines at [[MOS:BOLDTITLE]] and [[MOS:BOLDSYN]] recommend regular bolding. The use of this template has been briefly discussed [[Wikipedia talk:Manual of Style/Lead section/Archive 20#Shouldn't we use semantic markup in the lead?|in 2018]] and [[Template talk:Strong#Use in lead sections of articles|in 2022]].</ref>
* After the lead, it {{em|can}} be used to highlight crucial terms of importance only slightly secondary to that of the article title and its synonyms. For example, the article on a viral infection might use {{tnull|strong}} to highlight the names of two identified strains of the disease in a "Varieties" section, as an aid to scannability.
* In unusual cases (most often direct quotations) it is used to represent contextually important text, if the passage were spoken rather than written (e.g., because it indicates shouting).
* Outside articles, it {{em|should}} be used (but {{as of|July 2021|lc=y}} isn't yet common) in polls, XfD processes, RfX votes, and similar comments and debates where users indicate that they approve of or disagree with a view or proposal. Example: "{{strong|Support}}, because of this and that reasons [...]" or "{{strong|Oppose}}, because of this and that reasons [...]".
== When this template should not be used ==
Because {{tnull|strong}} is strictly for semantic (meaningful) importance, it should not be used for layout, typography conventions and such. In these different cases, bold <code><nowiki>'''...'''</nowiki></code> (which resolves to {{tag|b}} in the browser or other user agent) should be used instead. It also should not be used when the text to which it is applied is boldfaced for some other reason (e.g., it is part of a heading); in such cases use {{tlx|em}} instead. Avoid using {{tnull|strong}} in non-quoted sentences that end in an exclamation point. And it is usually excessive to use it on terms that are Wikilinked, since the link markup acts to indicate importance itself.
==See also==
* {{tlx|strongbad}} – same but red
* {{tlx|stronggood}} – same but green
* {{tlx|em}} – for italic rather than bold semantic emphasis<br />
== Notes ==
{{Reflist}}
{{Semantic markup templates|show}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES BELOW THIS LINE, PLEASE: -->
[[Category:Semantic markup templates]]
[[Category:Wikipedia XHTML tag-replacing templates]]
}}</includeonly>
d57770ca63c42772e3b463cedb4cb3b0744779c2
Template:Terminate sentence
10
115
132
2023-10-08T05:59:49Z
Silentg
2
Created page with "{{{1}}}{{#if:{{#invoke:text|sentenceTerminated|{{{1|}}}}}||{{{2|.}}}}}<noinclude>{{documentation}}</noinclude>"
wikitext
text/x-wiki
{{{1}}}{{#if:{{#invoke:text|sentenceTerminated|{{{1|}}}}}||{{{2|.}}}}}<noinclude>{{documentation}}</noinclude>
e4142b47b3d7959b82f582bab87ca10768d4d93b
Template:Terminate sentence/doc
10
116
133
2023-10-08T06:00:22Z
Silentg
2
Created page with "{{Documentation subpage}} {{Lua|Module:Text}} This template returns its first argument, after adding a full stop (or its second argument) if the sentence was not finished. == Usage == * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|The rain in Spain}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|falls mainly on the plain.}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|BANG|!}} <includeonly>{{sandbox other|| <!-- Categories below this line --> {{uncat}} }}</includeonly>"
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:Text}}
This template returns its first argument, after adding a full stop (or its second argument) if the sentence was not finished.
== Usage ==
* {{#invoke:DemoTemplate|{{BASEPAGENAME}}|The rain in Spain}}
* {{#invoke:DemoTemplate|{{BASEPAGENAME}}|falls mainly on the plain.}}
* {{#invoke:DemoTemplate|{{BASEPAGENAME}}|BANG|!}}
<includeonly>{{sandbox other||
<!-- Categories below this line -->
{{uncat}}
}}</includeonly>
db9d452de3f1bb665d5a8bcc447b1ab341dc711b
Module:Text
828
117
134
2023-10-08T06:01:17Z
Silentg
2
Created page with "local yesNo = require("Module:Yesno") local Text = { serial = "2022-07-21", suite = "Text" } --[=[ Text utilities ]=] -- local globals local PatternCJK = false local PatternCombined = false local PatternLatin = false local PatternTerminated = false local QuoteLang = false local QuoteType = false local RangesLatin = false local SeekQuote = false local function initLatinData() if not RangesLatin then..."
Scribunto
text/plain
local yesNo = require("Module:Yesno")
local Text = { serial = "2022-07-21",
suite = "Text" }
--[=[
Text utilities
]=]
-- local globals
local PatternCJK = false
local PatternCombined = false
local PatternLatin = false
local PatternTerminated = false
local QuoteLang = false
local QuoteType = false
local RangesLatin = false
local SeekQuote = false
local function initLatinData()
if not RangesLatin then
RangesLatin = { { 7, 687 },
{ 7531, 7578 },
{ 7680, 7935 },
{ 8194, 8250 } }
end
if not PatternLatin then
local range
PatternLatin = "^["
for i = 1, #RangesLatin do
range = RangesLatin[ i ]
PatternLatin = PatternLatin ..
mw.ustring.char( range[ 1 ], 45, range[ 2 ] )
end -- for i
PatternLatin = PatternLatin .. "]*$"
end
end
local function initQuoteData()
-- Create quote definitions
if not QuoteLang then
QuoteLang =
{ af = "bd",
ar = "la",
be = "labd",
bg = "bd",
ca = "la",
cs = "bd",
da = "bd",
de = "bd",
dsb = "bd",
et = "bd",
el = "lald",
en = "ld",
es = "la",
eu = "la",
-- fa = "la",
fi = "rd",
fr = "laSPC",
ga = "ld",
he = "ldla",
hr = "bd",
hsb = "bd",
hu = "bd",
hy = "labd",
id = "rd",
is = "bd",
it = "ld",
ja = "x300C",
ka = "bd",
ko = "ld",
lt = "bd",
lv = "bd",
nl = "ld",
nn = "la",
no = "la",
pl = "bdla",
pt = "lald",
ro = "bdla",
ru = "labd",
sk = "bd",
sl = "bd",
sq = "la",
sr = "bx",
sv = "rd",
th = "ld",
tr = "ld",
uk = "la",
zh = "ld",
["de-ch"] = "la",
["en-gb"] = "lsld",
["en-us"] = "ld",
["fr-ch"] = "la",
["it-ch"] = "la",
["pt-br"] = "ldla",
["zh-tw"] = "x300C",
["zh-cn"] = "ld" }
end
if not QuoteType then
QuoteType =
{ bd = { { 8222, 8220 }, { 8218, 8217 } },
bdla = { { 8222, 8220 }, { 171, 187 } },
bx = { { 8222, 8221 }, { 8218, 8217 } },
la = { { 171, 187 }, { 8249, 8250 } },
laSPC = { { 171, 187 }, { 8249, 8250 }, true },
labd = { { 171, 187 }, { 8222, 8220 } },
lald = { { 171, 187 }, { 8220, 8221 } },
ld = { { 8220, 8221 }, { 8216, 8217 } },
ldla = { { 8220, 8221 }, { 171, 187 } },
lsld = { { 8216, 8217 }, { 8220, 8221 } },
rd = { { 8221, 8221 }, { 8217, 8217 } },
x300C = { { 0x300C, 0x300D },
{ 0x300E, 0x300F } } }
end
end -- initQuoteData()
local function fiatQuote( apply, alien, advance )
-- Quote text
-- Parameter:
-- apply -- string, with text
-- alien -- string, with language code
-- advance -- number, with level 1 or 2
local r = apply and tostring(apply) or ""
alien = alien or "en"
advance = tonumber(advance) or 0
local suite
initQuoteData()
local slang = alien:match( "^(%l+)-" )
suite = QuoteLang[alien] or slang and QuoteLang[slang] or QuoteLang["en"]
if suite then
local quotes = QuoteType[ suite ]
if quotes then
local space
if quotes[ 3 ] then
space = " "
else
space = ""
end
quotes = quotes[ advance ]
if quotes then
r = mw.ustring.format( "%s%s%s%s%s",
mw.ustring.char( quotes[ 1 ] ),
space,
apply,
space,
mw.ustring.char( quotes[ 2 ] ) )
end
else
mw.log( "fiatQuote() " .. suite )
end
end
return r
end -- fiatQuote()
Text.char = function ( apply, again, accept )
-- Create string from codepoints
-- Parameter:
-- apply -- table (sequence) with numerical codepoints, or nil
-- again -- number of repetitions, or nil
-- accept -- true, if no error messages to be appended
-- Returns: string
local r = ""
apply = type(apply) == "table" and apply or {}
again = math.floor(tonumber(again) or 1)
if again < 1 then
return ""
end
local bad = { }
local codes = { }
for _, v in ipairs( apply ) do
local n = tonumber(v)
if not n or (n < 32 and n ~= 9 and n ~= 10) then
table.insert(bad, tostring(v))
else
table.insert(codes, math.floor(n))
end
end
if #bad > 0 then
if not accept then
r = tostring( mw.html.create( "span" )
:addClass( "error" )
:wikitext( "bad codepoints: " .. table.concat( bad, " " )) )
end
return r
end
if #codes > 0 then
r = mw.ustring.char( unpack( codes ) )
if again > 1 then
r = r:rep(again)
end
end
return r
end -- Text.char()
local function trimAndFormat(args, fmt)
local result = {}
if type(args) ~= 'table' then
args = {args}
end
for _, v in ipairs(args) do
v = mw.text.trim(tostring(v))
if v ~= "" then
table.insert(result,fmt and mw.ustring.format(fmt, v) or v)
end
end
return result
end
Text.concatParams = function ( args, apply, adapt )
-- Concat list items into one string
-- Parameter:
-- args -- table (sequence) with numKey=string
-- apply -- string (optional); separator (default: "|")
-- adapt -- string (optional); format including "%s"
-- Returns: string
local collect = { }
return table.concat(trimAndFormat(args,adapt), apply or "|")
end -- Text.concatParams()
Text.containsCJK = function ( s )
-- Is any CJK code within?
-- Parameter:
-- s -- string
-- Returns: true, if CJK detected
s = s and tostring(s) or ""
if not patternCJK then
patternCJK = mw.ustring.char( 91,
4352, 45, 4607,
11904, 45, 42191,
43072, 45, 43135,
44032, 45, 55215,
63744, 45, 64255,
65072, 45, 65103,
65381, 45, 65500,
131072, 45, 196607,
93 )
end
return mw.ustring.find( s, patternCJK ) ~= nil
end -- Text.containsCJK()
Text.removeDelimited = function (s, prefix, suffix)
-- Remove all text in s delimited by prefix and suffix (inclusive)
-- Arguments:
-- s = string to process
-- prefix = initial delimiter
-- suffix = ending delimiter
-- Returns: stripped string
s = s and tostring(s) or ""
prefix = prefix and tostring(prefix) or ""
suffix = suffix and tostring(suffix) or ""
local prefixLen = mw.ustring.len(prefix)
local suffixLen = mw.ustring.len(suffix)
if prefixLen == 0 or suffixLen == 0 then
return s
end
local i = s:find(prefix, 1, true)
local r = s
local j
while i do
j = r:find(suffix, i + prefixLen)
if j then
r = r:sub(1, i - 1)..r:sub(j+suffixLen)
else
r = r:sub(1, i - 1)
end
i = r:find(prefix, 1, true)
end
return r
end
Text.getPlain = function ( adjust )
-- Remove wikisyntax from string, except templates
-- Parameter:
-- adjust -- string
-- Returns: string
local r = Text.removeDelimited(adjust,"<!--","-->")
r = r:gsub( "(</?%l[^>]*>)", "" )
:gsub( "'''", "" )
:gsub( "''", "" )
:gsub( " ", " " )
return r
end -- Text.getPlain()
Text.isLatinRange = function (s)
-- Are characters expected to be latin or symbols within latin texts?
-- Arguments:
-- s = string to analyze
-- Returns: true, if valid for latin only
s = s and tostring(s) or "" --- ensure input is always string
initLatinData()
return mw.ustring.match(s, PatternLatin) ~= nil
end -- Text.isLatinRange()
Text.isQuote = function ( s )
-- Is this character any quotation mark?
-- Parameter:
-- s = single character to analyze
-- Returns: true, if s is quotation mark
s = s and tostring(s) or ""
if s == "" then
return false
end
if not SeekQuote then
SeekQuote = mw.ustring.char( 34, -- "
39, -- '
171, -- laquo
187, -- raquo
8216, -- lsquo
8217, -- rsquo
8218, -- sbquo
8220, -- ldquo
8221, -- rdquo
8222, -- bdquo
8249, -- lsaquo
8250, -- rsaquo
0x300C, -- CJK
0x300D, -- CJK
0x300E, -- CJK
0x300F ) -- CJK
end
return mw.ustring.find( SeekQuote, s, 1, true ) ~= nil
end -- Text.isQuote()
Text.listToText = function ( args, adapt )
-- Format list items similar to mw.text.listToText()
-- Parameter:
-- args -- table (sequence) with numKey=string
-- adapt -- string (optional); format including "%s"
-- Returns: string
return mw.text.listToText(trimAndFormat(args, adapt))
end -- Text.listToText()
Text.quote = function ( apply, alien, advance )
-- Quote text
-- Parameter:
-- apply -- string, with text
-- alien -- string, with language code, or nil
-- advance -- number, with level 1 or 2, or nil
-- Returns: quoted string
apply = apply and tostring(apply) or ""
local mode, slang
if type( alien ) == "string" then
slang = mw.text.trim( alien ):lower()
else
slang = mw.title.getCurrentTitle().pageLanguage
if not slang then
-- TODO FIXME: Introduction expected 2017-04
slang = mw.language.getContentLanguage():getCode()
end
end
if advance == 2 then
mode = 2
else
mode = 1
end
return fiatQuote( mw.text.trim( apply ), slang, mode )
end -- Text.quote()
Text.quoteUnquoted = function ( apply, alien, advance )
-- Quote text, if not yet quoted and not empty
-- Parameter:
-- apply -- string, with text
-- alien -- string, with language code, or nil
-- advance -- number, with level 1 or 2, or nil
-- Returns: string; possibly quoted
local r = mw.text.trim( apply and tostring(apply) or "" )
local s = mw.ustring.sub( r, 1, 1 )
if s ~= "" and not Text.isQuote( s, advance ) then
s = mw.ustring.sub( r, -1, 1 )
if not Text.isQuote( s ) then
r = Text.quote( r, alien, advance )
end
end
return r
end -- Text.quoteUnquoted()
Text.removeDiacritics = function ( adjust )
-- Remove all diacritics
-- Parameter:
-- adjust -- string
-- Returns: string; all latin letters should be ASCII
-- or basic greek or cyrillic or symbols etc.
local cleanup, decomposed
if not PatternCombined then
PatternCombined = mw.ustring.char( 91,
0x0300, 45, 0x036F,
0x1AB0, 45, 0x1AFF,
0x1DC0, 45, 0x1DFF,
0xFE20, 45, 0xFE2F,
93 )
end
decomposed = mw.ustring.toNFD( adjust and tostring(adjust) or "" )
cleanup = mw.ustring.gsub( decomposed, PatternCombined, "" )
return mw.ustring.toNFC( cleanup )
end -- Text.removeDiacritics()
Text.sentenceTerminated = function ( analyse )
-- Is string terminated by dot, question or exclamation mark?
-- Quotation, link termination and so on granted
-- Parameter:
-- analyse -- string
-- Returns: true, if sentence terminated
local r
if not PatternTerminated then
PatternTerminated = mw.ustring.char( 91,
12290,
65281,
65294,
65311 )
.. "!%.%?…][\"'%]‹›«»‘’“”]*$"
end
if mw.ustring.find( analyse, PatternTerminated ) then
r = true
else
r = false
end
return r
end -- Text.sentenceTerminated()
Text.ucfirstAll = function ( adjust)
-- Capitalize all words
-- Arguments:
-- adjust = string to adjust
-- Returns: string with all first letters in upper case
adjust = adjust and tostring(adjust) or ""
local r = mw.text.decode(adjust,true)
local i = 1
local c, j, m
m = (r ~= adjust)
r = " "..r
while i do
i = mw.ustring.find( r, "%W%l", i )
if i then
j = i + 1
c = mw.ustring.upper( mw.ustring.sub( r, j, j ) )
r = string.format( "%s%s%s",
mw.ustring.sub( r, 1, i ),
c,
mw.ustring.sub( r, i + 2 ) )
i = j
end
end -- while i
r = r:sub( 2 )
if m then
r = mw.text.encode(r)
end
return r
end -- Text.ucfirstAll()
Text.uprightNonlatin = function ( adjust )
-- Ensure non-italics for non-latin text parts
-- One single greek letter might be granted
-- Precondition:
-- adjust -- string
-- Returns: string with non-latin parts enclosed in <span>
local r
initLatinData()
if mw.ustring.match( adjust, PatternLatin ) then
-- latin only, horizontal dashes, quotes
r = adjust
else
local c
local j = false
local k = 1
local m = false
local n = mw.ustring.len( adjust )
local span = "%s%s<span dir='auto' style='font-style:normal'>%s</span>"
local flat = function ( a )
-- isLatin
local range
for i = 1, #RangesLatin do
range = RangesLatin[ i ]
if a >= range[ 1 ] and a <= range[ 2 ] then
return true
end
end -- for i
end -- flat()
local focus = function ( a )
-- char is not ambivalent
local r = ( a > 64 )
if r then
r = ( a < 8192 or a > 8212 )
else
r = ( a == 38 or a == 60 ) -- '&' '<'
end
return r
end -- focus()
local form = function ( a )
return string.format( span,
r,
mw.ustring.sub( adjust, k, j - 1 ),
mw.ustring.sub( adjust, j, a ) )
end -- form()
r = ""
for i = 1, n do
c = mw.ustring.codepoint( adjust, i, i )
if focus( c ) then
if flat( c ) then
if j then
if m then
if i == m then
-- single greek letter.
j = false
end
m = false
end
if j then
local nx = i - 1
local s = ""
for ix = nx, 1, -1 do
c = mw.ustring.sub( adjust, ix, ix )
if c == " " or c == "(" then
nx = nx - 1
s = c .. s
else
break -- for ix
end
end -- for ix
r = form( nx ) .. s
j = false
k = i
end
end
elseif not j then
j = i
if c >= 880 and c <= 1023 then
-- single greek letter?
m = i + 1
else
m = false
end
end
elseif m then
m = m + 1
end
end -- for i
if j and ( not m or m < n ) then
r = form( n )
else
r = r .. mw.ustring.sub( adjust, k )
end
end
return r
end -- Text.uprightNonlatin()
Text.test = function ( about )
local r
if about == "quote" then
initQuoteData()
r = { }
r.QuoteLang = QuoteLang
r.QuoteType = QuoteType
end
return r
end -- Text.test()
-- Export
local p = { }
for _, func in ipairs({'containsCJK','isLatinRange','isQuote','sentenceTerminated'}) do
p[func] = function (frame)
return Text[func]( frame.args[ 1 ] or "" ) and "1" or ""
end
end
for _, func in ipairs({'getPlain','removeDiacritics','ucfirstAll','uprightNonlatin'}) do
p[func] = function (frame)
return Text[func]( frame.args[ 1 ] or "" )
end
end
function p.char( frame )
local params = frame:getParent().args
local story = params[ 1 ]
local codes, lenient, multiple
if not story then
params = frame.args
story = params[ 1 ]
end
if story then
local items = mw.text.split( mw.text.trim(story), "%s+" )
if #items > 0 then
local j
lenient = (yesNo(params.errors) == false)
codes = { }
multiple = tonumber( params[ "*" ] )
for _, v in ipairs( items ) do
j = tonumber((v:sub( 1, 1 ) == "x" and "0" or "") .. v)
table.insert( codes, j or v )
end
end
end
return Text.char( codes, multiple, lenient )
end
function p.concatParams( frame )
local args
local template = frame.args.template
if type( template ) == "string" then
template = mw.text.trim( template )
template = ( template == "1" )
end
if template then
args = frame:getParent().args
else
args = frame.args
end
return Text.concatParams( args,
frame.args.separator,
frame.args.format )
end
function p.listToFormat(frame)
local lists = {}
local pformat = frame.args["format"]
local sep = frame.args["sep"] or ";"
-- Parameter parsen: Listen
for k, v in pairs(frame.args) do
local knum = tonumber(k)
if knum then lists[knum] = v end
end
-- Listen splitten
local maxListLen = 0
for i = 1, #lists do
lists[i] = mw.text.split(lists[i], sep)
if #lists[i] > maxListLen then maxListLen = #lists[i] end
end
-- Ergebnisstring generieren
local result = ""
local result_line = ""
for i = 1, maxListLen do
result_line = pformat
for j = 1, #lists do
result_line = mw.ustring.gsub(result_line, "%%s", lists[j][i], 1)
end
result = result .. result_line
end
return result
end
function p.listToText( frame )
local args
local template = frame.args.template
if type( template ) == "string" then
template = mw.text.trim( template )
template = ( template == "1" )
end
if template then
args = frame:getParent().args
else
args = frame.args
end
return Text.listToText( args, frame.args.format )
end
function p.quote( frame )
local slang = frame.args[2]
if type( slang ) == "string" then
slang = mw.text.trim( slang )
if slang == "" then
slang = false
end
end
return Text.quote( frame.args[ 1 ] or "",
slang,
tonumber( frame.args[3] ) )
end
function p.quoteUnquoted( frame )
local slang = frame.args[2]
if type( slang ) == "string" then
slang = mw.text.trim( slang )
if slang == "" then
slang = false
end
end
return Text.quoteUnquoted( frame.args[ 1 ] or "",
slang,
tonumber( frame.args[3] ) )
end
function p.zip(frame)
local lists = {}
local seps = {}
local defaultsep = frame.args["sep"] or ""
local innersep = frame.args["isep"] or ""
local outersep = frame.args["osep"] or ""
-- Parameter parsen
for k, v in pairs(frame.args) do
local knum = tonumber(k)
if knum then lists[knum] = v else
if string.sub(k, 1, 3) == "sep" then
local sepnum = tonumber(string.sub(k, 4))
if sepnum then seps[sepnum] = v end
end
end
end
-- sofern keine expliziten Separatoren angegeben sind, den Standardseparator verwenden
for i = 1, math.max(#seps, #lists) do
if not seps[i] then seps[i] = defaultsep end
end
-- Listen splitten
local maxListLen = 0
for i = 1, #lists do
lists[i] = mw.text.split(lists[i], seps[i])
if #lists[i] > maxListLen then maxListLen = #lists[i] end
end
local result = ""
for i = 1, maxListLen do
if i ~= 1 then result = result .. outersep end
for j = 1, #lists do
if j ~= 1 then result = result .. innersep end
result = result .. (lists[j][i] or "")
end
end
return result
end
function p.failsafe()
return Text.serial
end
p.Text = function ()
return Text
end -- p.Text
return p
07f1fc4d39342fd92bdae1c5463bbfede7eeda1a
Module:Text/doc
828
118
135
2023-10-08T06:02:20Z
Silentg
2
Created page with "{{high use}} '''<code>Text</code>''' – Module containing methods for the manipulation of text, wikimarkup and some HTML. == {{Anchor|Vorlage}} Functions for templates == All methods have an unnamed parameter containing the text. The return value is an empty string if the parameter does not meet the conditions. When the condition is matched or some result is successfully found, strings of at least one character are returned. ; char {{Anchor|char}} : Creates a string..."
wikitext
text/x-wiki
{{high use}}
'''<code>Text</code>''' – Module containing methods for the manipulation of text, wikimarkup and some HTML.
== {{Anchor|Vorlage}} Functions for templates ==
All methods have an unnamed parameter containing the text.
The return value is an empty string if the parameter does not meet the conditions. When the condition is matched or some result is successfully found, strings of at least one character are returned.
; char {{Anchor|char}}
: Creates a string from a list of character codes.
::; 1
::: Space-separated list of character codes
::; *
::: Number of repetitions of the list in parameter '''1'''; (Default 1).
::; errors
::: <code>0</code> – Silence errors
; concatParams {{Anchor|concatParams}}
: Combine any number of elements into a list, like <code>table.concat()</code> in Lua.
: From a template:
::; 1
::: First element; missing and empty elements are ignored.
::; 2 3 4 5 6 …
::: Further list elements
: From Lua
::; args
::: ''table (sequence)'' of the elements
::; apply
::: Separator between elements; defaults to <code>|</code>
::; adapt
::: optional formatting, which will be applied to each element; must contain <code>%s</code>.
; containsCJK {{Anchor|containsCJK}}
: Returns whether the input string contains any [[CJK characters]]
:* Returns nothing if there are no CJK characters
; removeDelimited
: Remove all text between delimiters, including the delimiters themselves.
; getPlain{{Anchor|getPlain}}
: Remove wikimarkup (except templates): comments, tags, bold, italic, nbsp
; isLatinRange {{Anchor|isLatinRange}}
: Returns some content, unless the string contains a character that would not normally be found in Latin text.
:* Returns nothing if there is a non-Latin string.
; isQuote {{Anchor|isQuote}}
: Returns some content if the parameter passed is a single character, and that character is a quote, such as <code>'</code>.
:* Returns nothing for multiple characters, or if the character passed is not a quote.
; listToText {{Anchor|listToText}}
: Formats list elements analogously to [[:mw:Extension:Scribunto/Lua_reference_manual#mw.text.listToText|mw.text.listToText()]].
: The elements are separated by a comma and space ; the word "and" appears between the first and last.
: Unnamed parameters become the list items.
: Optional parameters for <code>#invoke</code>:
:* <code>format</code> – Every list element will first be formatted with this format string; see [[:mw:Extension:Scribunto/Lua_reference_manual#string.format|here]] for how to construct this string. The string must contain at least one <code>%s</code> sequence.
:* <code>template=1</code> – List elements should be taken from the calling template.
: Returns the resulting string.
; quote {{Anchor|quote}}
: Wrap the string in quotes; quotes can be chosen for a specific language.
::; 1
::: Input text (will be automatically trimmed); may be empty.
::; 2
::: ''(optional)'' the [[ISO 639]] language code for the quote marks; should be one of the [[:de:Wikipedia:Lua/Modul/Text/Test#Anführungszeichen|supported languages]] {{in lang|de}}
::; 3
::: ''(optional)'' <code>2</code> for second level quotes. This means the single quote marks in a statement such as: Jack said, “Jill said ‘fish’ last Tuesday.”
; quoteUnquoted {{Anchor|quoteUnquoted}}
:
: Wrap the string in quotes; quotes can be chosen for a specific language. Will not quote an empty string, and will not quote if there is a quote at the start or end of the (trimmed) string.
::; 1
::: Input text (will be automatically trimmed); may be empty.
::; 2
::: ''(optional)'' the [[ISO 639]] language code for the quote marks; should be one of the [[:de:Wikipedia:Lua/Modul/Text/Test#Anführungszeichen|supported languages]] {{in lang|de}}
::; 3
::: ''(optional)'' <code>2</code> for second level quotes. This means the single quote marks in a statement such as: Jack said, “Jill said ‘fish’ last Tuesday.”
; removeDiacritics {{Anchor|removeDiacritics}}
: Removes all [[diacritical marks]] from the input.
::; 1
::;: Input text
; sentenceTerminated {{Anchor|sentenceTerminated}}
: Is this sentence terminated? Should work with CJK, and allows quotation marks to follow.
:* Returns nothing if the sentence is unterminated.
; ucfirstAll {{Anchor|ucfirstAll}}
: The first letter of every recognized word is converted to upper case. This contrasts with the parser function {{tlg|:mw:ucfirst|alttext=ucfirst:}} which changes only the first character of the whole string passed.
: A few common HTML entities are protected; the implementation of this may mean that numerical entities passed (e.g. <code>&#38;)</code> are converted to <code>&amp;</code> form
; uprightNonlatin {{Anchor|uprightNonlatin}}
: Takes a string. Italicized non-Latin characters are un-italicized, unless they are a single Greek letter.
; zip {{Anchor|zip}}
: Combines a tuple of lists by [[convolution (computer science)|convolution]]. This is easiest to explain by example: given two lists, list1 = "a b c" and list2 = "1 2 3", then<br><code>zip(liste1, liste2, sep = " ", isep = "-", osep = "/")</code><br>outputs<br><code>a-1/b-2/c-3</code>
:* 1, 2, 3, … – Lists to be combined
:* <code>sep</code> – A separator (in Lua [[regex]] form) used to split the lists. If empty, the lists are split into individual characters.
:* <code>sep1</code>, <code>sep2</code>, <code>sep3</code>, … – Allows a different separator to be used for each list.
:* <code>isep</code> – Output separator; placed between elements which were at the ''same'' index in their lists.
:* <code>osep</code> – Output separator; placed between elements which had ''different'' original indices; i.e. between the groups joined with <code>isep</code>
=== Examples and test page ===
There are [[:de:Wikipedia:Lua/Modul/Text/Test|tests available]] {{in lang|de}} to illustrate this in practice.
== {{Anchor|Lua}} Use in another Lua module ==
All of the above functions can be called from other Lua modules. Use <code>require()</code>; the below code checks for errors loading it:
<syntaxhighlight lang="lua">
local lucky, Text = pcall( require, "Module:Text" )
if type( Text ) == "table" then
Text = Text.Text()
else
-- In the event of errors, Text is an error message.
return "<span class=\"error\">" .. Text .. "</span>"
end
</syntaxhighlight>
You may then call:
* Text.char( apply, again, accept )
* Text.concatParams( args, separator, format )
* Text.containsCJK( s )
* Text.removeDelimited( s )
* Text.getPlain( s )
* Text.isLatinRange( s )
* Text.isQuote( c )
* Text.listToText( table, format )
* Text.quote( s, lang, mode )
* Text.quoteUnquoted( s, lang, mode )
* Text.removeDiacritics( s )
* Text.sentenceTerminated( s )
* Text.ucfirstAll( s )
* Text.uprightNonlatin( s )
* <s>Text.zip(…)</s>
* ''Text.test( s )''
== Usage ==
This is a general library; use it anywhere.
== Dependencies ==
None.
== See also ==
{{String-handling templates}}
<includeonly>{{Sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Modules that manipulate strings]]
}}</includeonly>
3a499e88041508f8c831c2343f30f9cad14008b0
Template:High use
10
119
136
2023-10-08T06:03:15Z
Silentg
2
Redirected page to [[Template:High-use]]
wikitext
text/x-wiki
#Redirect [[Template:High-use]]
{{Redirect category shell|{{R from modification}}{{R from template shortcut}}}}
65ce33c8f2d9659b46256ceb1f7fe57859f66fb2
Template:Redirect category shell
10
120
137
2023-10-08T06:04:24Z
Silentg
2
Created page with "__NONEWSECTIONLINK__{{Mbox | name = Redirect category shell | type = move | image = none | style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em; | textstyle = padding-top: 0.9em; padding-bottom: 0.9em; | text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}} |:: ''{{{h}}}''..."
wikitext
text/x-wiki
__NONEWSECTIONLINK__{{Mbox
| name = Redirect category shell
| type = move
| image = none
| style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em;
| textstyle = padding-top: 0.9em; padding-bottom: 0.9em;
| text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}}
|:: ''{{{h}}}''
}}<!--
Automatically detect protected redirects:
--><includeonly>{{#switch: {{PROTECTIONLEVEL:move}}
|sysop|templateeditor|extendedconfirmed={{pp-move|small=yes}}
}}{{#switch: {{PROTECTIONLEVEL:edit}}
|sysop={{R protected|embed=yes}}
|templateeditor={{pp-protected|small=yes}}{{R template protected|embed=yes}}
|extendedconfirmed={{pp-protected|small=yes}}{{R extended-protected|embed=yes}}
|autoconfirmed={{pp-protected|small=yes}}{{R semi-protected|embed=yes}}
| <!--Not protected, or only semi-move-protected-->
}}</includeonly>{{#if: {{{1|}}}||<includeonly>
* {{red|'''Important – Please Read! {{maroon|This template should {{em|not}} be applied without parameters by bot nor by any automated or semi-automated process. It should {{em|not}} be used without parameters {{em|unless you want to learn how to categorize redirects}}. For editors who want to learn how to categorize redirects, this template is a {{em|learning tool}}. {{em|Only}} those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter!}}'''}}</includeonly>
* '''Manifold sort''': If help is needed to determine appropriate categories, then this redirect populates '''{{Cat|Miscellaneous redirects}}'''. Monitors of that category will check this redirect and add or remove [[Wikipedia:Categorizing redirects|rcats]] as needed.{{#ifeq: {{lc:{{{nocat|false}}}}} | false |{{{category|<includeonly>[[Category:Miscellaneous redirects]]</includeonly>}}}}}
}}
{{#if: {{{2|}}}|{{{2}}}|{{{1|}}}}}{{#if: {{{1|}}}{{{2|}}}||{{#ifeq: {{ROOTPAGENAME}}|Redirect category shell||[[Category:Redirect category shell without parameters]]}}}}
''<small>When appropriate, [[Wikipedia:Protection policy|protection levels]] are automatically sensed, described and categorized.</small>''
}}<noinclude>
{{Documentation}}
</noinclude>
554b3ada8f7ca8c0e840ea18a0344d3e94d13c38
Template:Redirect category shell/doc
10
121
138
2023-10-08T06:05:07Z
Silentg
2
Created page with "{{documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{hatnote|This template supplements the redirect categorization done by adding rcats individually to redirects and by past usage of the now deprecated {{tl|This is a redirect}} template. Its creation and usage is the direct result of [[Template talk:This is a redirect|discussion]]s about the benefits and the shortc..."
wikitext
text/x-wiki
{{documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{hatnote|This template supplements the redirect categorization done by adding rcats individually to redirects and by past usage of the now deprecated {{tl|This is a redirect}} template. Its creation and usage is the direct result of [[Template talk:This is a redirect|discussion]]s about the benefits and the shortcomings of the ''This is a redirect'' template.}}
{{High-use}}
{{mbox|image=none|text=[[File:Ambox warning pn.svg|20px|alt=red-outlined triangle containing exclamation point]] {{red|'''Important – please read! {{maroon|This template should ''not'' be used by a bot nor by any automated or semi-automated process without the use of parameters. It should ''not'' be used without parameters ''unless the redirect is manually categorized''. This template may be used as a ''learning tool'' to assist editors who wish to learn how to categorize redirects. ''Only'' those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter.}}'''}} <small>([[#When used alone|more below]])</small>}}
{{Substitution|not|nor should this template and most redirect category (rcat) templates be used to tag [[Wikipedia:Soft redirects|soft redirects]]. Two exceptions are ''{{tl|Soft redirect with Wikidata item}}'', which can be used on all soft redirects, and ''{{tl|R category with possibilities}}'', which can only be used on soft redirects in the category namespace}}
{{#ifeq:{{SUBPAGENAME}}|sandbox|{{Template redirect|Rcat shell/sandbox}}|{{template redirect|Redirect shell|R cat shell|Rcat shell|RCAT shell}}{{Template shortcut|redr|rcatsh}}}}
This template is similar to {{tl|WikiProject banner shell}} in that it may be used to add one or more appropriate redirect category ([[WP:RCAT|rcat]]) templates, along with their parameters, to redirects. Additionally, this template ''automatically'' senses, describes, categorizes and changes [[WP:PP|protection levels]] when appropriate. A third important function is to help editors learn more about redirect categorization by use of the {{c|Miscellaneous redirects|manifold sort}}. For more information see the page below and the [[WP:TMR|main rcat '''index''']].
__TOC__
==Purpose==
As with the ''This is a redirect'' template, this template is based on a [[Wikipedia talk:WikiProject Redirect/Archive 1#New meta-template(s) idea|proposal]] to standardize [[wp:redirect templates|redirect templates]] (rcats). Its basic purpose is to simplify the process of tagging and categorizing redirects.
Like the ''This is a redirect'' template, this shell template is also able to help newer contributors learn the redirect category system. Details of this part of the purpose of this shell template may be found in the [[#When used alone|When used alone]] section below.
Protection levels are automatically detected by this template by use of {{tl|pp-protected}} and {{tl|pp-move}}. When edit protection or move protection (or both) is applied to a redirect that has been tagged with this template, the protection level is automatically detected, and the redirect will be tagged with a protection rcat and sorted to the appropriate protection-related category(ies). When protection is altered or removed, then the protection-related rcats and category(ies) will also be (automatically) changed or removed from the redirect.
This template can categorize and display the text (with parameters) of any number of rcats that are needed (usually from one to seven).<br />
<ref name="mbox" group="Mbox note">When the wiki markup of this template is opened, it is seen that this is an "mbox-based" template. "Mbox" stands for "multi namespace message box", which is a meta-[[Help:A quick guide to templates|template]] that works in all namespaces. There can be a problem with this mbox unless editors are careful to place ''Redirect category shell'' '''on its own line at the ''very beginning of the line'''''. If this is done then all is well; if this is not done, then [[HTML Tidy]] may interfere with the mbox and cause this template to appear in an abnormal and unexpected manner when saved. So be careful where you leave this template placed in a redirect's Edit screen, take another look at the above [[#goodread|readability guide]], and be sure to preview your edits – all your edits.
: '''{{green|Correct:}}'''
<syntaxhighlight lang="wikitext">
#REDIRECT [[(target page)]]
{{Redirect category shell||
{{R unprintworthy}}
}}
</syntaxhighlight>
: '''{{red|''Not'' correct:}}'''
<syntaxhighlight lang="wikitext">
#REDIRECT [[(target page)]] {{Redirect category shell||{{R unprintworthy}}}}
</syntaxhighlight>
: ''A blank line is usually placed between the redirect target and this template to make the "Edit" screen easier to read.''</ref>
<ref name="printworthiness" group="Printworthiness note">Where the [[WP:printworthiness|printworthiness]] of a [[WP:mainspace|mainspace]] redirect is concerned, there are three kinds of [[WP:RCAT|rcat]]s:
# those that populate the {{c|Printworthy redirects}} category by default,
# those that populate the {{c|Unprintworthy redirects}} category by default, and
# those that do not default to either of the above, and which leave it to the editor to decide based upon best knowledge whether or not a mainspace redirect is suitable for a printed or DVD version of ''Wikipedia''.
At present, those that are types 1 and 2 will populate the appropriate printworthiness category, however the notice will not appear within the mbox of this template unless either {{tl|R printworthy}} or {{tl|R unprintworthy}} is listed as an rcat within this template. For example, if a redirect is tagged with:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from ambiguous term}}
}}
</syntaxhighlight>
...then the hidden categories populated will be {{c|Redirects from ambiguous pages}}, {{c|Unprintworthy redirects}} and any appropriate protection categories. These will appear at the bottom of the redirect page only to registered users who are logged in and who have set their preferences to see hidden categories. The mbox that will appear to all readers would look like:
{{Redirect category shell|
{{R from ambiguous term/demo|embed=yes}}
}}
To show the printability or printworthiness information in the mbox, then the redirect must be tagged with either the printworthy or unprintworthy rcat as in the following example:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from ambiguous term}}
{{R unprintworthy}}
}}
</syntaxhighlight>
...which produces:
{{Redirect category shell|
{{R from ambiguous term/demo|embed=yes}}
{{R unprintworthy|embed=yes}}
}}
'''''Only then''' will the printability, ''printworthy'' or ''unprintworthy'', be described within this template's mbox on the redirect page.''</ref>
==Usage==
Used by itself with no parameters, for example, {{tlc|Redirect category shell}} (and its alias {{tlc|Rcat shell}}), the template will appear as it does at the top of this page, and the redirect will populate {{Cat|Miscellaneous redirects}}. That category will also be populated if the first parameter is left empty while rcats occupy the second parameter. This is useful when an editor adds rcats and yet feels unsure that there may be at least one other rcat with category that may be used to tag the redirect. Monitors of the ''Miscellaneous redirects'' category will then help decide if another rcat(s) is needed. Then the empty first parameter may be excluded by removing either the first or second pipe. That will remove the redirect from ''Category:Miscellaneous redirects''. [[#When used alone|See below]] for more information.
This template may hold any number of different redirect category ([[WP:RCAT|rcat]]) templates, usually from one to seven. The choices for editors are listed at [[Wikipedia:Template index/Redirect pages]] both alphabetically and by function. Any of those rcats may be used either with their full template name, e.g., '''R from alternative language''', or with an alias (shortcut redirect), which may be found in each rcat's [[WP:TDOC|documentation]].
An unnamed parameter, {{para|1}}, has been introduced in this template and works as follows:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|1=
{{rcat 1}}
{{rcat 2}}
{{rcat 3}}
{{rcat N}}
}}
</syntaxhighlight>
: ''or'' the {{code|1{{=}}}} may be omitted:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{rcat 1}}
{{rcat 2}}
{{rcat 3}}
{{rcat N}}
}}
</syntaxhighlight>
As with all templates that have unnamed (numbered) parameters, the numbers and equal signs may be omitted.
"N" represents the highest number of rcats that can be used in this template, and at this point the only limit would be any wiki markup ceiling that may exist. Usually, from one to seven rcats suffice; however, more rcats can be used if required.
The actual sequence of rcats is left to editors – there is no priority as to which rcat should be "first" and which rcats should "follow" in any particular order.
A second unnamed parameter, {{para|2}}, has also been introduced. This gives this template the same "help" functionality that is used in the ''This is a redirect'' template. If the first parameter is left "empty", then {{cat|Miscellaneous redirects}} will be populated:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|1=|2=
{{rcat 1}}
{{rcat 2}}
{{rcat N}}
}}
</syntaxhighlight>
:''or'' if a second pipe is placed directly after the first pipe, then that will accomplish the same manifold sort:
<syntaxhighlight lang="wikitext">
{{Redirect category shell||
{{rcat 1}}
{{rcat 2}}
{{rcat N}}
}}
</syntaxhighlight>
Note the double pipe after the word "shell" above, which indicates an empty first parameter. Editors who monitor the ''Miscellaneous redirects'' category will come to the redirect and check, add or remove rcats as needed.
Also, when used by itself this template will appear as it does at the top of this page and populate the ''Miscellaneous redirects'' category:
<syntaxhighlight lang="wikitext">
{{Redirect category shell}}
</syntaxhighlight>
{{anchor|goodread}}
This template may be added to a redirect page in the following manner:
<syntaxhighlight lang="wikitext">
#REDIRECT [[(target page name)]]
{{Redirect category shell||
{{R from short name}}
{{R unprintworthy}}
}}
</syntaxhighlight>
: It can be noted here that the rcats can also go on the same line as the ''Redirect category shell'' template:
<syntaxhighlight lang="wikitext">
#REDIRECT [[(target page name)]]
{{Redirect category shell||{{R from short name}}{{R unprintworthy}}}}
</syntaxhighlight>
: Again, note the double pipe after "shell" above, which indicates an empty first parameter. Leave the first parameter empty to sort a redirect to {{cat|Miscellaneous redirects}} ''in addition to'' the categories of the rcats that are used. In this case the {{c|Redirects from short names}} and {{c|Unprintworthy redirects}} categories will also be populated. Monitors of the "Miscellaneous redirects" category will help editors when needed.
Generally for good readability on the edit screen, this template is placed beginning on the third line of that screen as follows:
<syntaxhighlight lang="wikitext">
Line 1: #REDIRECT [[(target page name)]]
</syntaxhighlight>
Line 2: {{red|<small>(please leave this line blank for emphasis and ease of reading by editors)</small>}}
<syntaxhighlight lang="wikitext">
Line 3: {{Redirect category shell|{{R from move}}{{R to section}}{{R printworthy}}}}
</syntaxhighlight>
: ''See also: section titled '''[[#Mbox-based|Mbox note]]''' below.''
=== Parameters ===
In addition to the unnamed {{para|1}} and {{para|2}} parameters, there is a "hatnote" parameter, {{para|h}}, which provides an italicized TOP note when needed. For example:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|h=This code has not been confirmed as an [[International Air Transport Association airport code|IATA]] airport code.|
{{R from airport code}}
}}
</syntaxhighlight>
...uses the rcat {{tl|R from airport code}} and produces:<!-- Note: An Mbox is used below rather than the template to illustrate the error box, which only appears on redirect pages. -->
{{Mbox
| name = This is a redirect/rcat
| type = move
| image = none
| style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em;
| textstyle = padding-top: 0.9em; padding-bottom: 0.9em;
| text = [[File:Symbol redirect arrow with gradient.svg|25px|link=]] '''This page is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''
:: ''This code has not been confirmed as an [[International Air Transport Association airport code|IATA]] airport code.''
* {{R from airport code|embed=yes}}
{{Ombox|type=content|image=[[File:Stop hand orange.svg|50px]]|text={{Error|The above [[WP:RCAT|rcat]] should only be used to categorize redirects that are in the ''[[WP:main|main]]'' namespace.}}}}
''<small>When appropriate, [[WP:PP|protection levels]] are automatically sensed, described and categorized.</small>''
}}
:''An error box appears that illustrates what happens if an editor uses an rcat in the wrong namespace. Correct namespaces are found on individual rcat documentation pages. In addition to the error box, the redirect '''''will not''''' be sorted to the rcat's category; instead it will populate '''''{{cat|Pages with templates in the wrong namespace}}!''' ''If an error box appears when an edit is '''previewed''', then appropriate changes can be made ''before'' the redirect page is actually '''saved'''.''
:''Also, note the pipe symbol ''(|)'' that follows the text in the {{para|h}} parameter. If this pipe is omitted, very unusual results will be seen when your edit is previewed or saved. Be sure to include that pipe at the very end of the text if the {{para|h}} parameter is used to form a hatnote.''
==== Rcat parameters ====
In addition to this template's ability to act as a shell template for rcats, it accepts all of the parameters that rcats accept. Rcat parameters, when needed, will work in this template as follows:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from plural|printworthy}}
}}
</syntaxhighlight>
This subdues the {{c|Unprintworthy redirects}} category to which {{tl|R from plural}} defaults and populates the {{c|Printworthy redirects}} category instead. The position an rcat holds will have no effect on the parameters of other rcats that are used to tag a redirect:
<syntaxhighlight lang="wikitext" style="font-size:95%;overflow:auto;">
{{Redirect category shell|
{{R from move}}
{{R from modification}}
{{R from alternative name}}
{{R from alternative language|en|es}}
{{R for convenience}}
{{R from plural|printworthy}}
{{R printworthy}}
}}
</syntaxhighlight>
In the above example, {{tl|R from plural}} is the sixth rcat, and its first parameter is used to change from "unprintworthy" to "printworthy". {{tl|R from alternative language}}) holds the 4th position, and its first parameter is used to house the [[Wikipedia:Template messages/Redirect language codes|ISO 639 language code]] of the source language, in this case '''<code>{{nbsp}}en{{nbsp}}</code>''' for [[English language|English]]. Its second parameter houses the language code for the targeted page, in this case '''<code>{{nbsp}}es{{nbsp}}</code>''' for the [[Spanish language]]. It does not matter if the relative position of these rcats changes for any reason, their individual parameters will continue to be effective.
If more rcat parameters are used, then they work the same way. For example, if a redirect exists that is a misspelling of a title, it can be tagged with {{tl|R from misspelling}} in the following manner:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from misspelling|(correct spelling if needed)|printworthy}}
{{R printworthy}}
}}
</syntaxhighlight>
In this case, the rcat's ''{{para|1}}'' parameter is the correct spelling (used only if the target of the redirect is '''not''' the correct spelling). The rcat's ''{{para|2}}'' parameter can be used to change from the default "unprintworthy" categorization. Some misspellings may be helpful in a printed version of ''Wikipedia'', so the second parameter in ''R from misspelling'' above is used to subdue its default "unprintworthy" category sort, and the redirect will populate {{cat|Printworthy redirects}} instead. In this shell template, the order of the rcats will not affect the rcats' parameters. If an editor checks the page history and finds that the above redirect is also the result of a page move and inserts {{tl|R from move}} at the top of the order:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from move}}
{{R from misspelling|(correct spelling)|printworthy}}
{{R printworthy}}
}}
</syntaxhighlight>
...the parameters of the ''R from misspelling'' rcat template will not be affected, as they may be when used in the ''This is a redirect'' template.
An example of a "printworthy misspelling" can be found at template {{tl|R from misspelling}}.
'''Another example:'''
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from alternative language|ja|es}}
{{R unprintworthy}}
}}
</syntaxhighlight>
The above code will sort the redirect into three categories:
* {{c|Redirects from Japanese-language terms}} ({{para|1|ja}}),
* {{c|Redirects to Spanish-language terms}} ({{para|2|es}}) and
* {{c|Unprintworthy redirects}}
''See the lists of [[List of ISO 639-1 codes|ISO 639-1]] and [[List of ISO 639-2 codes|ISO 639-2]] codes for two- and three-letter language codes that can be used this way. See also [[Wikipedia:Template messages/Redirect language codes]] for common codes that are already used on redirects.''
=== When used alone ===
This template is designed to help contributors who are unfamiliar with categorizing redirects by enabling them to sort redirects into the monitored {{c|Miscellaneous redirects}} category. Do not hesitate to use this important function to help with sorting redirects to correct and appropriate categories.
There are two ways to sort a redirect into the ''Miscellaneous redirects category''. When this template is used without any rcats, it will perform the miscellaneous sort:
{{tlx|Redirect category shell}}...
{{Redirect category shell|nocat=true}}
Also, if one or more rcats are known, but an editor is unsure that there might be one or more ''other'' rcats that are needed, then leave the first parameter blank (type two pipes together → <code>||</code>):
<syntaxhighlight lang="wikitext">
{{Redirect category shell||
{{R from subtopic}}
{{R printworthy}}
}}
</syntaxhighlight>
{{Redirect category shell|nocat=true||
{{R from subtopic|embed=yes}}
{{R printworthy|embed=yes}}
}}
Monitors of the ''Miscellaneous redirects'' category will check the redirect, add other rcats if needed and then remove the empty first parameter.
==Comparison==
[[Template:Redirect category shell/Comparison]] shows the difference in the appearance of text between when individual rcats are used and when this template is used.
==Other templates==
This template may also carry and hold other templates within it. Even the {{tl|DEFAULTSORT}} magic word and a [[WP:sort key|sort key]] may be used either inside this template or below it. Another template commonly used within the ''Redirect category shell'' template is {{tl|Italic title}} and its shortcut to format titles in italics. Some rcats such as {{tl|R from book}} and {{tl|R from film}} automatically format the redirect names in italics. Any appropriate template may be used within this shell template in the following manner:
<syntaxhighlight lang="wikitext">
{{Redirect category shell|
{{R from move}}
{{R from alternative name}}
{{Italic title}}
{{DEFAULTSORT:Hobbit, The}}
}}
</syntaxhighlight>
==Notes==
{{anchor|Mbox-based}}
'''Mbox note'''
{{Reflist|group="Mbox note"}}
'''Printworthiness note'''
{{See also|Wikipedia:Printability}}
{{Reflist|group="Printworthiness note"}}
==See also==
* {{tl|Talk page of a redirect}}, to "[[WP:SRD|soft]]" redirect a [[WP:subject page|subject page]]'s talk page that has already been created '''''and given content''''' (project banners, deletion/merge notices, discussions)
* [[Wikipedia:Protection policy]], for questions related to this template's ability to detect protection levels
* [[Wikipedia:Template index/Redirect pages]], a functional and an alphabetical index of rcats
* [[Wikipedia:WikiProject Redirect/Style guide|WikiProject Redirect/Style guide]]
==Tracking categories==
* {{clc|Redirect category shell without parameters}}
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "Redirect categories",
"description": "1 or more redirect category templates.",
"example": "{{R from alternative name}}",
"type": "content",
"suggested": true
},
"2": {
"label": "Redirect categories (more needed)",
"description": "Same as Redirect categories, except that the redirect is also added to Category:Miscellaneous redirects.",
"type": "content"
},
"h": {
"label": "Hatnote",
"description": "A hatnote to display above the redirect categories.",
"type": "line"
},
"nocat": {
"label": "No category",
"description": "Don't add this redirect to Category:Miscellaneous redirects, even if Redirect categories has been left empty.",
"type": "boolean"
},
"category": {
"label": "Category",
"description": "The category to add this redirect to if the Redirect categories parameter is empty. Defaults to Category:Miscellaneous redirects.",
"example": "[[Category:Miscellaneous redirects]]",
"type": "line"
}
},
"description": "This template may be used to add one or more appropriate redirect category (rcat) templates, along with their parameters, to redirects. Additionally, this template automatically senses, describes, categorizes and changes protection levels when appropriate.",
"paramOrder": [
"1",
"2",
"h",
"nocat",
"category"
]
}
</templatedata>
{{R template index}}
<includeonly>{{sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:WikiProject Redirect templates|Redirect category shell]]
[[Category:Redirect templates| ]]
[[Category:Template shell templates]]
}}</includeonly>
80ef79af880a2b8a82210513173bbda8e8bad17f
Template:Nobold
10
122
139
2023-10-08T06:06:45Z
Silentg
2
Created page with "<templatestyles src="Nobold/styles.css"/><span class="nobold">{{{1}}}</span><noinclude> {{documentation}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --> </noinclude>"
wikitext
text/x-wiki
<templatestyles src="Nobold/styles.css"/><span class="nobold">{{{1}}}</span><noinclude>
{{documentation}}
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS -->
</noinclude>
9c92b5951772bb26ca0fbe9256418b65e47700dd
Template:Nobold/doc
10
123
140
2023-10-08T06:07:07Z
Silentg
2
Created page with "<noinclude>{{documentation subpage}}</noinclude> {{COinS safe|n}} {{High-risk|155,000+}} {{Uses TemplateStyles|Template:Nobold/styles.css}} : <code><nowiki>{{nobold|</nowiki>''text-string''}}</code> To display text (''text-string'') at normal font-weight within a context where the default font-weight is '''bold''', e.g. header cells in tables. ==TemplateData== {{TemplateData header}} <templatedata> { "params": { "1": { "label": "Input text", "description": "Tex..."
wikitext
text/x-wiki
<noinclude>{{documentation subpage}}</noinclude>
{{COinS safe|n}}
{{High-risk|155,000+}}
{{Uses TemplateStyles|Template:Nobold/styles.css}}
: <code><nowiki>{{nobold|</nowiki>''text-string''}}</code>
To display text (''text-string'') at normal font-weight within a context where the default font-weight is '''bold''', e.g. header cells in tables.
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "Input text",
"description": "Text to present not bolded",
"type": "string",
"required": true
}
},
"format": "inline"
}
</templatedata>
==See also==
* [[Template:No selflink]] (prevents selflinks from bolding, something this template does not do)
* [[Template:Noitalic]]
* [[Template:Nocaps]]
<includeonly>{{Sandbox other||
<!--Categories-->
[[Category:Text-specific formatting and function templates|{{PAGENAME}}]]
}}</includeonly>
de0aca7a93c6c5343702ea4d971bd69e3ec49793
Template:Nobold/styles.css
10
124
141
2023-10-08T06:07:44Z
Silentg
2
Created page with "/* {{pp-template}} */ /* Styling for Template:Nobold */ .nobold { font-weight: normal; }"
sanitized-css
text/css
/* {{pp-template}} */
/* Styling for Template:Nobold */
.nobold {
font-weight: normal;
}
83e5f0adacf8c7984251f1fd9d11ed82ebaadf03
Template:Template other
10
125
142
2023-10-08T06:09:00Z
Silentg
2
Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude>"
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Template:Template other/doc
10
126
143
2023-10-08T06:09:18Z
Silentg
2
Created page with "{{Documentation subpage}} {{Template shortcut|ns10}} {{High-risk|2=yes|all-pages=yes}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This is a meta-template which helps other templates detect whether they are used in the "Template:" namespace. ==Usage== This template usually takes one or two parameters: : {{tc|Template other |''[result/action if on a template page]'' (|''[res..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{Template shortcut|ns10}}
{{High-risk|2=yes|all-pages=yes}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
This is a meta-template which helps other templates detect whether they are used in the "Template:" namespace.
==Usage==
This template usually takes one or two parameters:
: {{tc|Template other |''[result/action if on a template page]'' (|''[result/action if on another type of page]'')}}
For example, if {{tlf|Template other |On template page |Not on template page}} were on a "Template:" page, it would return:
: {{Template other |On template page |Not on template page}}
On any other type of page (e.g. "Wikipedia:", "User:") it would return:
: {{Template other|demospace=other |On template page |Not on template page}}
A typical use is to manage the categorization of template pages. Adding {{tlf|Template other | |{{!((}}Category:''[category name]''{{))!}}}} to a template, for instance, means it would only categorize a page when that page isn't a template page. (The first parameter consists of nothing, so no action taken if/when the template is on a template page.)
==Demospace==
The parameter {{mono|demospace}} can be used to demonstrate or test this template. By default, it is undefined and has no effect on the template's action, but:
* when set as "template" ({{para|demospace|template}}), it prompts the template to return the ''first'' result/action above (i.e. to behave as if on a "Template:" page) even if the template is on a different type of page;
* when set as "other" ({{para|demospace|other}}), it prompts the template to return the ''second'' result/action above (i.e. to behave as if not on a "Template:" page) even if the template is on a "Template:" page.
For example:
<syntaxhighlight lang="wikitext">
{{Template other
| demospace = template
| Template page text
| Other pages text
}}
</syntaxhighlight>
No matter on what kind of page the code above is used, it returns:
{{Template other
| demospace = template
| Template page text
| Other pages text
}}
You can make it so your template also understands the '''demospace''' parameter. That means you can demonstrate the different appearances of your template in the documentation for your template. Then do like this:
<syntaxhighlight lang="wikitext">
{{template other
| Template page text
| Other pages text
| demospace = {{{demospace|}}}
}}
</syntaxhighlight>
==Technical details==
This template detects "Template talk:" pages as type '''other'''. For more details relevant to this template, see {{tl|Main talk other}}, which works similarly.
{{Namespace and pagename-detecting templates}}
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Namespace manipulation templates]]
[[Category:Template namespace templates]]
}}</includeonly>
f38c4cdbcd335644503bcaf560fab37b9e4f97b2
Template:Tlf
10
127
144
2023-10-08T06:12:11Z
Silentg
2
Redirected page to [[Template:Template link with link off]]
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with link off]]
{{Redirect category shell|
{{R from move}}
}}
52759e1d3f7c9aa4a03d0b7d4f84f4c6adf53edf
Template:Template link with link off
10
128
145
2023-10-08T06:12:57Z
Silentg
2
Created page with "<includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude> {{Documentation|1=Template:Tlg/doc |content = {{tlg/doc|tlf}} }} <!-- Add categories to the /doc subpage, not here! --> </noinclude>"
wikitext
text/x-wiki
<includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlf}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
b099fea5d1f36b0b4b9cb253ad3a9f4e095f6851
Module:Infobox/doc
828
129
146
2023-10-08T07:13:32Z
Silentg
2
Created page with "{{High-use|3308957|all-pages = yes}} {{module rating|protected}} {{Lua|Module:Navbar|Module:Italic title}} {{Uses TemplateStyles|Module:Infobox/styles.css|Template:Hlist/styles.css|Template:Plainlist/styles.css}} '''Module:Infobox''' is a [[WP:Module|module]] that implements the {{tl|Infobox}} template. Please see the template page for usage instructions. == Tracking categories == * {{clc|Pages using infobox templates with ignored data cells}} * {{clc|Articles using in..."
wikitext
text/x-wiki
{{High-use|3308957|all-pages = yes}}
{{module rating|protected}}
{{Lua|Module:Navbar|Module:Italic title}}
{{Uses TemplateStyles|Module:Infobox/styles.css|Template:Hlist/styles.css|Template:Plainlist/styles.css}}
'''Module:Infobox''' is a [[WP:Module|module]] that implements the {{tl|Infobox}} template. Please see the template page for usage instructions.
== Tracking categories ==
* {{clc|Pages using infobox templates with ignored data cells}}
* {{clc|Articles using infobox templates with no data rows}}
* {{clc|Pages using embedded infobox templates with the title parameter}}
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox||
[[Category:Modules that add a tracking category]]
[[Category:Wikipedia infoboxes]]
[[Category:Infobox modules]]
[[Category:Modules that check for strip markers]]
}}</includeonly>
936ad219eb263a6f3293d62f667bd7b5db1059c1
Template:Hlist
10
130
147
2023-10-08T07:15:07Z
Silentg
2
Created page with "{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>"
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
9e3824c2e3c0e0dbef2f37556ac0b994987fecf9
Template:Hlist/doc
10
131
148
2023-10-08T07:15:30Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{used in system|in [[MediaWiki:Citethispage-content]]}} {{Lua|Module:List}} {{Uses TemplateStyles|Template:Hlist/styles.css}} {{tlr|clear=right|Horizontal list|dotlist|hlist1}} This template creates [[WP:HLIST|horizontal lists]]. Each item in the list may be individually styled with [[CSS]]. __TOC__ {{-}} == Usage == '''Basic usage''' {{pre|<nowiki>{{</nowiki>hl..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Categories go at the bottom of this page and interwikis go in Wikidata. -->
{{used in system|in [[MediaWiki:Citethispage-content]]}}
{{Lua|Module:List}}
{{Uses TemplateStyles|Template:Hlist/styles.css}}
{{tlr|clear=right|Horizontal list|dotlist|hlist1}}
This template creates [[WP:HLIST|horizontal lists]]. Each item in the list may be individually styled with [[CSS]].
__TOC__
{{-}}
== Usage ==
'''Basic usage'''
{{pre|<nowiki>{{</nowiki>hlist<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...<nowiki>}}</nowiki>}}
'''All parameters'''
{{pre|
<nowiki>{{</nowiki>hlist
<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...
<nowiki>|class = </nowiki>''class for div tag''
<nowiki>|style = </nowiki>''style for div tag''
<nowiki>|list_style = </nowiki>''style for ul tag''
<nowiki>|item_style = </nowiki>''style for all li tags''
<nowiki>|item1_style = </nowiki>''style for first li tag''
<nowiki>|item2_style = </nowiki>''style for second li tag''
<nowiki>|</nowiki>...
<nowiki>|indent = </nowiki>''the number of tabs to indent''
<nowiki>}}</nowiki>
}}
== Parameters ==
* Positional parameters (<code>1</code>, <code>2</code>, <code>3</code>...): these are the list items. If no list items are present, the module will output nothing.
* <code>class</code>: a custom class for the {{tag|div}} tags surrounding the list. Set to <code>inline</code> when using {{tlf|hlist}} inside text.
* <code>style</code>: a custom CSS style for the {{tag|div}} tags surrounding the list, e.g. <code>font-size: 90%;</code>.
* <code>list_style</code>: a custom CSS style for the {{tag|ul}} tags around the list. The format is the same as for the {{para|style}} parameter.
* <code>item_style</code>: a custom CSS style for all of the list items (the {{tag|li}} tags). The format is the same as for the {{para|style}} parameter.
* <code>item1_style</code>, <code>item2_style</code>, <code>item3_style</code>...: custom CSS styles for each of the list items. The format is the same as for the {{para|style}} parameter.
* <code>indent</code>: the number of tabs to indent the list. Default value is 0.
== Examples ==
{{markup
| <nowiki>{{hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}}</nowiki>
| {{hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}}
| <nowiki>Giant planets ({{hlist|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).</nowiki>
| Giant planets ({{hlist|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).
| <nowiki>Giant planets ({{hlist|class=inline|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).</nowiki>
| Giant planets ({{hlist|class=inline|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).
| <nowiki>{{hlist|Winner|Runner-up|Third place|indent=2}}</nowiki>
| {{hlist|Winner|Runner-up|Third place|indent=2}}
| <nowiki>{{hlist|Winner|Runner-up|Third place|item_style=color:blue;}}</nowiki>
| {{hlist|Winner|Runner-up|Third place|item_style=color:blue;}}
| <nowiki>{{hlist|Winner|Runner-up|Third place|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki>
| {{hlist|Winner|Runner-up|Third place|item1_style=background-color:yellow;|item2_style=background-color:silver;}}
}}
== Avoiding Linter errors ==
{{tlf|hlist}} will produce [[Wikipedia:Linter|Linter]] [[Special:LintErrors/misc-tidy-replacement-issues|errors]] if placed inside a template that uses {{tag|span}} tags, such as {{tl|small}}, {{tl|larger}}, etc. To avoid this, use the substitutions from the table below:
{| {{table}}
! Incorrect markup !! Correct markup
|-
| <code><nowiki>{{small|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:85%}}</nowiki></code>
|-
| <code><nowiki>{{resize|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:90%}}</nowiki></code>
|-
| <code><nowiki>{{midsize|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:92%}}</nowiki></code>
|-
| <code><nowiki>{{larger|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:110%}}</nowiki></code>
|-
| <code><nowiki>{{big|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:120%}}</nowiki></code>
|-
| <code><nowiki>{{large|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:large}}</nowiki></code>
|-
| <code><nowiki>{{huge|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:180%}}</nowiki></code>
|-
| <code><nowiki>{{resize|x%|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:x%}}</nowiki></code>
|-
| <code><nowiki>{{font|size=x%|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:x%}}</nowiki></code>
|-
| <code><nowiki>{{nowrap|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=white-space: nowrap}}</nowiki></code>
|}
{{navbox lists}}
<includeonly>{{Sandbox other||
<!-- Categories go here, and interwikis go in Wikidata -->
[[Category:List formatting and function templates]]
}}</includeonly>
53a60ad328f2ec495bd209c2ef35941c2dff2323
Template:Plainlist
10
132
149
2023-10-08T07:17:40Z
Silentg
2
Created page with "<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude>"
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}|
{{{1}}}
</div>}}<noinclude></div>
{{documentation}}
</noinclude>
582fe7098c25c1ecfc0ad32f62ecd674ebe2bdf0
Template:Plainlist/doc
10
133
150
2023-10-08T07:17:59Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE --> {{High-use}} {{Template shortcut|PL}} {{Uses TemplateStyles|Template:Plainlist/styles.css}} This template provides a [[Web Content Accessibility Guidelines|WCAG]]/ISO-standards-compliant accessible alternative to <code><nowiki><br /></nowiki></code> separated lists, per [[WP:UBLIST]] and [[WP:PLIST]] == Usage == {{tl|plainlist}} starts a plain (i.e. unbulleted) list, such as: {{plainlis..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE -->
{{High-use}}
{{Template shortcut|PL}}
{{Uses TemplateStyles|Template:Plainlist/styles.css}}
This template provides a [[Web Content Accessibility Guidelines|WCAG]]/ISO-standards-compliant accessible alternative to <code><nowiki><br /></nowiki></code> separated lists, per [[WP:UBLIST]] and [[WP:PLIST]]
== Usage ==
{{tl|plainlist}} starts a plain (i.e. unbulleted) list, such as:
{{plainlist|
* [[cat]]
* [[dog]]
* [[horse]]
* [[cow]]
* [[sheep]]
* [[pig]]
}}
It uses proper HTML list markup, which is more standards-compliant and more accessible than separating list items with {{tag|br|s}}. Detailed reasons for using this template can be found at [[WP:UBLIST]].
This template can be used with or without {{tl|endplainlist}}. It is an alternative to {{tl|unbulleted list}}, which performs the same function in a more concise but less wiki-style manner. Note that {{tl|unbulleted list}} will work inside image captions, whereas {{tl|plainlist}} does not.
== Examples ==
{{Markup
|<nowiki>
{{plainlist|
* [[cat]]
* [[dog]]
* [[horse]]
* [[cow]]
* [[sheep]]
* [[pig]]
}}
</nowiki>
|
{{plainlist|
* [[cat]]
* [[dog]]
* [[horse]]
* [[cow]]
* [[sheep]]
* [[pig]]
}}
}}
=== Alternative syntax ===
{{Markup
|<nowiki>
{{plainlist}}
* [[cat]]
* [[dog]]
* [[horse]]
* [[cow]]
* [[sheep]]
* [[pig]]
{{endplainlist}}
</nowiki>
|
{{plainlist}}
* [[cat]]
* [[dog]]
* [[horse]]
* [[cow]]
* [[sheep]]
* [[pig]]
{{endplainlist}}
}}
== Parameters ==
{{Format TemplateData|JSON= {
"params": {
"1": {
"label": "List content",
"description": "If supplied, the list, as a normal bulleted list. (Every line should start with an asterisk. No blank lines between lines.) See template page for how this works otherwise.",
"type": "content",
"suggested": true
},
"class": {
"label": "CSS classes",
"description": "Adds a CSS class to the containing div.",
"type": "string",
"default": "The class \"plainlist\" is always applied."
},
"style": {
"label": "Custom CSS",
"description": "Adds CSS style options. Complex styles should not be used in articles (per [[WP:Deviations]]) but may be acceptable on user, project, and talk pages.",
"type": "string",
"example": "border:solid 1px silver; background:lightyellow"
},
"indent": {
"label": "Indent level",
"description": "Indents the list by a number of standard indents (one indent being 1.6em), particularly handy for inclusion in an indented discussion thread.",
"type": "number",
"example": "2"
}
},
"description": "This template provides a WCAG/ISO-standards-compliant accessible alternative to <br /> separated lists, per [[WP:UBLIST]] and [[WP:PLIST]]. It uses proper HTML list markup, which is more standards-compliant and more accessible than separating list items with <br />. Detailed reasons for using this template can be found at WP:UBLIST."
} }}
=== Controlling line-breaking ===
Template {{tlx|nbsp}} may be used with {{tlx|wbr}} and {{tlx|nowrap}} to control line-breaking in bulletless lists, to prevent wrapped long entries from being confused with multiple entries. See [[Template:Wbr/doc#Controlling line-breaking in infoboxes]] for details.
== Technical details ==
{{tl|Plainlist}} works by constructing a [[span and div|div]] with the [[Cascading Style Sheets|CSS]] class "plainlist" which has the styles listed in [[Template:Plainlist/styles.css]].
{| class="wikitable"
! Wikitext
! Expanded template
! HTML
|- style="vertical-align:top;"
| class="nowrap" | <pre>
{{Plainlist|
* Example 1
* Example 2
* Example 3
}}
</pre>
| class="nowrap" | {{nowiki2|tag=pre|
{{Plainlist|
* Example 1
* Example 2
* Example 3
}}
}}
| <syntaxhighlight lang="html">
<div class="plainlist">
<ul>
<li>Example 1</li>
<li>Example 2</li>
<li>Example 3</li>
</ul>
</div>
</syntaxhighlight>
|}
== Redirects ==
* {{tl|Startplainlist}}
== See also ==
* {{tl|unbulleted list}} – essentially the same but uses <code><nowiki>| ... | ... | ...</nowiki></code> instead of <code><nowiki>|* ... * ... * ...</nowiki></code>
* {{tl|flatlist}} and {{tl|hlist}} (replacements for comma- or dash-separated lists)
* {{tl|bulleted list}}
* {{tl|indented plainlist}}
* {{tl|ordered list}}
* {{section link|Template:Infobox person#Inline lists}} for more information on creating lists within the Infobox family of templates, with examples in the following {{section link|Template:Infobox person#Examples|nopage=y}}
{{navbox lists}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES HERE, THANKS -->
[[Category:List formatting and function templates|Plainlist]]
[[Category:Semantic markup templates]]
[[Category:Typing-aid templates|Plainlist]]
}}</includeonly>
3e643450c27b6fb02ce218d36c67d391a6e20482
Template:Siderbar
10
134
151
2023-10-08T09:19:46Z
Silentg
2
Created page with "{{#invoke:Sidebar|sidebar}}<noinclude> {{documentation}}</noinclude>"
wikitext
text/x-wiki
{{#invoke:Sidebar|sidebar}}<noinclude>
{{documentation}}</noinclude>
ab2498000a99daf324f656b0badd187b4a3e2b42
Template:Siderbar/doc
10
135
152
2023-10-08T09:20:09Z
Silentg
2
Created page with "{{Documentation subpage}} {{about|the vertical navigation template|the horizontal template|Template:Navbox|the left sidebar of the interface|mw:Manual:Interface/Sidebar{{!}}the article in the Mediawiki Manual}} {{#ifeq:{{FULLPAGENAME}}|Template:Sidebar|{{High-risk| approximately 145000 }}{{Template display|nomobile}}}} {{Lua|Module:Sidebar}} This template is a [[wikt:metatemplate|metatemplate]] for the creation of sidebar templates, i.e. boxes that are Vertical direct..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{about|the vertical navigation template|the horizontal template|Template:Navbox|the left sidebar of the interface|mw:Manual:Interface/Sidebar{{!}}the article in the Mediawiki Manual}}
{{#ifeq:{{FULLPAGENAME}}|Template:Sidebar|{{High-risk| approximately 145000 }}{{Template display|nomobile}}}}
{{Lua|Module:Sidebar}}
This template is a [[wikt:metatemplate|metatemplate]] for the creation of sidebar templates, i.e. boxes that are [[Vertical direction|vertically]] aligned [[Wikipedia:Navigation template|navigation templates]]. Sidebars, like [[Wikipedia:Manual of Style/Infoboxes|infoboxes]], are usually positioned on the right-hand side of a page.
{{tl|Sidebar with collapsible lists}} is a version of {{tl|Sidebar}} that adds collapsibility to its sections, i.e. the means to show or hide sections by clicking links beside their headings.
{{Navbox visibility}}
Note that [[MOS:LEAD]] discourages the placement of sidebars in the lead section of articles.
== Usage ==
{{Parameter names example |name= |outertitle |topimage |pretitle |title |image |caption |above |heading1 |content1 |heading2 |content2 |heading3 |content3 |content4=''…… etc ……'' |below}}
<pre>
{{Sidebar
| name = {{subst:PAGENAME}}
| class =
| wraplinks = <!-- "true" otherwise (default:) omit -->
| float =
| templatestyles =
| child templatestyles =
| grandchild templatestyles =
| outertitleclass =
| outertitle =
| topimageclass =
| topimage =
| topcaption =
| pretitleclass =
| pretitle =
| titleclass =
| title =
| imageclass =
| image =
| caption =
| headingclass =
| contentclass =
| aboveclass =
| above =
| heading1 =
| heading1class =
| content1 =
| content1class =
| heading2 =
| heading2class =
| content2 =
| content2class =
| heading3 =
| heading3class =
| content3 =
| content3class =
<!-- (omitting infinite heading/content parameters) -->
| belowclass =
| below =
| navbar =
}}
</pre>
Note that {{section link|Wikipedia:Manual of Style/Lead section#Elements}} discourages the placement of sidebars in the lead section of articles, though they may be included on a case-by-case basis.
== Parameters ==
{{anchor|Other parameters}}
No parameters are mandatory. If {{tl|navbar}} links are to function correctly (unless their appearance is suppressed; see the ''navbar'' parameter [[#Other parameters|below]]), the parameter ''name'' needs to be set (to [[Wikipedia:Page name|the name of]] the sidebar's page). (This does not apply if the [[Lua (programming language)|Lua module]] that produces {{tlf|Sidebar}}, [[Module:Sidebar]], is being used directly.)
{| class="wikitable"
|-
! scope="col" | Parameter
! scope="col" | Explanation
|-
| {{para|above}}
| Same as the {{para|above}} offered by {{tl|Navbox}}.
|-
| {{para|name}}
| The sidebar's name, i.e. the name following "Template:" in the title shown at the top of the sidebar's page. <br />Required if the {{small|{{smallcaps|V T E}}}} {{tl|navbar}} links at the bottom of the sidebar are to function correctly, unless their appearance is suppressed (see the ''navbar'' parameter [[#Other parameters|below]]) or {{tlf|Sidebar}} is not being used as a [[Wrapper function|wrapper]] for [[Module:Sidebar]]. When {{tlf|Sidebar}} is used as a wrapper, setting {{para|name|<nowiki>{{subst:PAGENAME}}</nowiki>}} is recommended.
|-
| {{para|float}}
| Accepts the values <code>none</code> and <code>left</code>. The former aligns the box left without floating and the latter with floating behavior. The default float is right and does not need specifying. Prefer this parameter (and passing it to any using templates such as with {{tl|Helpbox}}) to specifying your own floats in TemplateStyles.
|-
| {{para|outertitle}}
| Use to place a title for the sidebar immediately above the sidebar.
|-
| {{para|topimage}}
|style="padding-left:0.5em;"| Use to place an image at the top of the sidebar, i.e. above {{para|title}} (if used). Full wiki syntax is expected (i.e. <code><nowiki>[[File:...]]</nowiki></code>). <br />To add a caption below the image, use {{para|topcaption}}. <br />Per [[WP:SIDEBAR]] this field should only be used to define a generic image for a sidebar, not to provide custom images for individual articles: sidebars are not displayed on mobile.
|-
| {{para|pretitle}}
|style="padding-left:0.5em;"| Use to place a line such as "Part of the ''X'' series on" before the title.
|-
| {{para|title}}
|style="padding-left:0.5em;"| Use to place a title for the sidebar at the top of the sidebar. (If {{para|topimage}} is used, it will appear immediately below it).
|-
| {{para|image}}
|style="padding-left:0.5em;"| Use to place an image between the {{para|title}} (if used) and first section. As with {{para|topimage}}, full wiki syntax is expected (i.e. <code><nowiki>[[File:...]]</nowiki></code>). <br />To add a caption below the image, use {{para|caption}}.
|-
| {{para|heading<sub>n</sub>}}<br/>{{para|content<sub>n</sub>}}
|style="padding-left:0.5em;"| The ''n''th heading{{\}}content. ''content<sub>n</sub>'' is required if ''heading<sub>n</sub>'' is also to appear.
|-
| {{para|templatestyles}}
|style="padding-left:0.5em;"| See [[#TemplateStyles]].
|-
| id="Classes" |
*{{nowrap|{{para|class}} or {{para|bodyclass}}}}
*{{para|outertitleclass}}
*{{para|topimageclass}}
*{{para|pretitleclass}}
*{{para|titleclass}}
*{{para|imageclass}}
*{{para|aboveclass}}
*{{para|headingclass}}
*{{para|contentclass}}
*{{para|heading<sub>n</sub>class}}
*{{para|content<sub>n</sub>class}}
*{{para|belowclass}}
|style="padding-left:0.5em;"|
Classes can be used to make styles easier to target for [[#TemplateStyles|TemplateStyles]]. {{para|class}} must be used for this purpose for an entire sidebar (otherwise a page with multiple sidebars may take styles intended only for one sidebar). An example for a template named "Template:Example Sidebar" might have the class {{para|class|example-sidebar}}.
{{para|heading<sub>n</sub>class}} and {{para|content<sub>n</sub>class}} can be used to target a specific heading or content group. This should be needed only rarely.
These classes can also be used for [[WP:microformats|microformats]].
Dot before a class-name can be omitted: {{para|class|foo}}.
|-
| {{para|below}}
|style="padding-left:0.5em;"| Same as the {{para|below}} offered by {{tl|Navbox}}.<br />(Use, for example, to add one or more portal links to the bottom of the template (shown, by default, in bold).)
|-
| {{para|navbar}}
|style="padding-left:0.5em;"| When {{para|name}} is specified, {{tl|navbar}} is shown at the bottom of the sidebar. Setting {{para|navbar|off}} or {{para|navbar|none}} will suppress the {{navbar|Sidebar/doc|mini=1}} links showing.
|}
=== TemplateStyles ===
{{further|Wikipedia:TemplateStyles}}
The TemplateStyles parameters {{para|templatestyles}}, {{para|child templatestyles}}, and {{para|grandchild templatestyles}} take the pagename of a [[WP:TemplateStyles|TemplateStyles]] page and turn it into a TemplateStyles tag. The TemplateStyles tag is a much more powerful way to add styling to a sidebar.
Some rules of use:
# Always add a template-specific class in {{para|class}} so that the styles added to one sidebar will not "leak" into another sidebar. For example, [[Template:DYK tools]] has {{para|class|dyk-tools}} and the [[Template:DYK tools/styles.css]] page targets <code>.dyk-tools</code> for all of its added styling.
# Do not assume Template:Sidebar will continue to have a table structure (i.e., do not target <code>table</code> or any other table HTML in the TemplateStyles page). The table structure is soft-deprecated and will go away at some point in the future.
These tags are loaded in this order: Core templatestyles ([[Module:Sidebar/styles.css]]), templatestyles, child, and then grandchild, which can be used to 'cascade' the styles.
; {{para|templatestyles}}
: This parameter is intended for a template or module calling {{tl|sidebar}} directly.
; {{para|child templatestyles}}
: This parameter is intended for a template or module which calls a sidebar with {{para|templatestyles}}.
; {{para|grandchild templatestyles}}
: This parameter is intended for a template or module which calls a sidebar with {{para|child templatestyles}}.
The canonical list of classes output with each kind of element of a sidebar (i.e. output for all {{para|content<sub>n</sub>}}, or all cases of {{para|above}}) can be found in [[Module:Sidebar/configuration]] in the "class" table. The below is a non-authoritative but otherwise sufficient list for most generic styling:
{{div col}}
; <code>.sidebar</code>
: The top-level sidebar class.
; <code>.sidebar-outer-title</code>
: The class associated with a {{para|outertitle}}.
; <code>.sidebar-top-image</code>
: The class associated with a {{para|topimage}}.
; <code>.sidebar-top-caption</code>
: The class associated with a {{para|topcaption}}.
; <code>.sidebar-pretitle</code>
; <code>.sidebar-pretitle-with-top-image</code>
: The classes associated with a {{para|pretitle}}. Only one of these will be output per sidebar, depending on whether {{para|topimage}} is present.
; <code>.sidebar-title</code>
; <code>.sidebar-title-with-pretitle</code>
: The classes associated with a {{para|title}}. Only one of these will be output per sidebar, depending on whether {{para|pretitle}} is present.
; <code>.sidebar-image</code>
: The class associated with a {{para|image}}.
; <code>.sidebar-caption</code>
: The class associated with a {{para|caption}}.
; <code>.sidebar-above</code>
: The class associated with a {{para|above}}.
; <code>.sidebar-heading</code>
: The class associated with a {{para|heading<sub>n</sub>}}. Every heading will have this class.
; <code>.sidebar-content</code>
; <code>.sidebar-content-with-subgroup</code>
: The classes associated with {{para|content<sub>n</sub>}}. Every content group will have one of these classes, depending on whether the specific content has a subgroup.
; <code>.sidebar-below</code>
: The class associated with a {{para|below}}.
; <code>.sidebar-navbar</code>
: The class associated with a {{para|navbar}}.
{{div col end}}
==== Example TemplateStyles parameter use ====
For an example of a sidebar which does not need to support children templates of its own (whether because it has no children or because it wants no children):
<pre>
{{Sidebar
| title = Child Example
| class = sidebar-example
| templatestyles = Template:Sidebar/example/styles.css
}}
</pre>
For an example of a sidebar which does have its own children and an example of one of the children (grandchild templates have a similar use):
<div style="display: flex">
<pre>
{{Sidebar
| title = {{{title|Title Child Example}}}
| class = sidebar-example {{{class|}}}
| templatestyles = Template:Sidebar/example/styles.css
| child templatestyles = {{{child templatestyles|}}}
}}
</pre>
<pre>
{{Sidebar/child example
| title = Title Grandchild Example
| class = sidebar-child-example
| child templatestyles = Template:Sidebar/child example/styles.css
}}
</pre>
</div>
== Handling long links ==
{{tl|Normalwraplink}} may be used to handle individual links that should wrap within the sidebar or otherwise need to be made to wrap, in order to prevent the sidebar from becoming too wide. Use {{tlx|normalwraplink|{{var|longlinkname}}}}, where {{para||{{var|longlinkname}}}} is the long link without its square brackets.
Use the {{para|wraplinks|true}} parameter to enable link wrapping (disabling {{codett|lang=css|nowraplinks}} CSS class) for the whole template.
== Nesting ==
One sidebar template can be nested (embedded) into another one by using the {{para|child}} parameter. This feature can be used to create a modular sidebar, or to create more well-defined and logical sections.
{{Sidebar
| title = Top-level title
| content1 =
{{Sidebar |child=yes
| title = First subsection
| heading1 = Heading 1.1
| content1 = Content 1.1
}}
| content2 =
{{Sidebar |child=yes
| title = Second subsection
| heading1 = Heading 2.1
| content1 = Content 2.1
}}
| below = "below" text
}}
<pre style="position:relative;bottom:0.5em; overflow:auto;">
{{Sidebar
| title = Top-level title
| content1 =
{{Sidebar |child=yes
| title = First subsection
| heading1 = Heading 1.1
| content1 = Content 1.1
}}
| content2 =
{{Sidebar |child=yes
| title = Second subsection
| heading1 = Heading 2.1
| content1 = Content 2.1
}}
| below = "below" text
}}
</pre>
Note in the examples above that the child sidebar is placed in a {{code|content}} field, not a {{code|heading}} field. Notice also that the section subheadings do not appear in bold if this is not explicitly specified. To obtain bold section headings, move the titles to the {{code|heading}} field, using
{{Sidebar
| title = Top-level title
| heading1 = First subsection
| content1 =
{{Sidebar |child=yes
| heading1 = Heading 1.1
| content1 = Content 1.1
}}
| heading2 = Second subsection
| content2 =
{{Sidebar |child=yes
| heading1 = Heading 2.1
| content1 = Content 2.1
}}
| below = "below" text
}}
<pre style="position:relative;bottom:0.5em; overflow:auto;">
{{Sidebar
| title = Top-level title
| heading1 = First subsection
| content1 =
{{Sidebar |child=yes
| heading1 = Heading 1.1
| content1 = Content 1.1
}}
| heading2 = Second subsection
| content2 =
{{Sidebar |child=yes
| heading1 = Heading 2.1
| content1 = Content 2.1
}}
| below = "below" text
}}
</pre>
== Deprecated parameters ==
The following parameters are deprecated in favor of [[#TemplateStyles|TemplateStyles]] and templates/modules using them are categorized into [[:Category:Sidebars with styles needing conversion]]. The category page has further conversion information.
A specific real conversion example is [[Template:DYK tools]] where the [[Special:Diff/1002727584|styles were moved]] to [[Template:DYK tools/styles.css]].
{| class="wikitable"
|-
! scope="col" | Parameter
! scope="col" | Explanation
! scope="col" | TemplateStyles replacement class
|-
| {{nowrap|{{para|style}} or {{para|bodystyle}}}}
| Additional [[Help:Cascading Style Sheets|CSS]] for the whole sidebar.
| Class assigned to the template in {{para|class}}
|-
| {{para|basestyle}}
| Additional CSS for a grabbag of parameters: {{para|pretitle}}, {{para|title}}, {{para|heading<sub>n</sub>}}, and {{para|listtitle<sub>n</sub>}} (for {{tl|sidebar with collapsible lists}}).
| See related parameters for targeting pretitle, title, all headings, and all lists. Applies {{em|before}} the specific style parameter so must be placed above that parameter's declarations if any in the TemplateStyles sheet.
|-
|{{para|outertitlestyle}}
|Additional CSS for {{Para|outertitle}}.
| {{code|lang=css|.sidebar-outer-title}}
|-
|{{para|topimagestyle}}
|Additional CSS for {{Para|topimage}}.
| {{code|lang=css|.sidebar-top-image}}
|-
|{{para|topcaptionstyle}}
|Additional CSS for {{Para|topcaption}}.
| {{code|lang=css|.sidebar-topcaption}}
|-
|{{para|pretitlestyle}}
|Additional CSS for {{Para|pretitle}}.
| {{code|lang=css|.sidebar-pretitle}} or {{code|lang=css|.sidebar-pretitle-with-top-image}}
|-
|{{para|titlestyle}}
|Additional CSS for {{Para|title}}.
| {{code|lang=css|.sidebar-title}} or {{code|lang=css|.sidebar-title-with-pretitle}}
|-
|{{para|imagestyle}}
|Additional CSS for {{Para|image}}.
| {{code|lang=css|.sidebar-image}}
|-
|{{para|captionstyle}}
|Additional CSS for {{Para|caption}}.
| {{code|lang=css|.sidebar-caption}}
|-
|{{para|abovestyle}}
|Additional CSS for {{Para|above}}.
| {{code|lang=css|.sidebar-above}}
|-
| {{para|headingstyle}}
| Additional CSS for section headings.
| {{code|lang=css|.sidebar-heading}}
|-
| {{para|heading<sub>n</sub>style}}
| Additional CSS for {{Para|heading<sub>n</sub>}}.
| Class assigned to the heading in {{para|heading<sub>n</sub>class}}
|-
| {{para|contentstyle}}
| Additional CSS for all section content.
| {{code|lang=css|.sidebar-content}} and/or {{code|lang=css|.sidebar-content-with-subgroup}}
|-
| {{para|content<sub>n</sub>style}}
| Additional CSS for {{Para|content<sub>n</sub>}}.
| Class assigned to the content in {{para|content<sub>n</sub>class}}
|-
| {{para|belowstyle}}
| Additional CSS for {{Para|below}}.
| {{code|lang=css|.sidebar-below}}
|-
| {{para|navbarstyle}}
| Additional CSS for the generated navbar.
| {{code|lang=css|.sidebar-navbar}}
|-
| {{para|navbarfontstyle}}
| Additional CSS passed to the navbar module to target the VTE (colors usually).
| {{code|lang=css|.sidebar-navbar li, .sidebar-navbar a}}
|}
== Tracking category ==
* {{clc|Pages using sidebar with the child parameter}}
* {{clc|Sidebars with styles needing conversion}}
== See also ==
* [[Special:Permalink/609911857|Last pre-Lua version]]
* {{tl|Sidebar with collapsible lists}}
* {{tl|Infobox}}
* {{tl|Side box}}
* [[Wikipedia:UBLIST]], for help using unbulleted lists within content.
<includeonly>{{Sandbox other||
[[Category:Sidebar meta-templates| ]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
9d0f725376f726cc8c0e0c95eb2c2dbea394caec
Module:Sidebar
828
136
153
2023-10-08T09:20:54Z
Silentg
2
Created page with "require('strict') local cfg = mw.loadData('Module:Sidebar/configuration') local p = {} local getArgs = require('Module:Arguments').getArgs --[[ Categorizes calling templates and modules with a 'style' parameter of any sort for tracking to convert to TemplateStyles. TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module. TODO would probably want to remove /log and /archive as CS1 does ]] local function categorizeTemplatesWithInlineStyle..."
Scribunto
text/plain
require('strict')
local cfg = mw.loadData('Module:Sidebar/configuration')
local p = {}
local getArgs = require('Module:Arguments').getArgs
--[[
Categorizes calling templates and modules with a 'style' parameter of any sort
for tracking to convert to TemplateStyles.
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module.
TODO would probably want to remove /log and /archive as CS1 does
]]
local function categorizeTemplatesWithInlineStyles(args)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 and title.namespace ~= 828 then return '' end
for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do
if title.text:match(pattern) then return '' end
end
for key, _ in pairs(args) do
if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then
return cfg.i18n.category.conversion
end
end
end
--[[
For compatibility with the original {{sidebar with collapsible lists}}
implementation, which passed some parameters through {{#if}} to trim their
whitespace. This also triggered the automatic newline behavior.
]]
-- See ([[meta:Help:Newlines and spaces#Automatic newline]])
local function trimAndAddAutomaticNewline(s)
s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")
if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then
return '\n' .. s
else
return s
end
end
--[[
Finds whether a sidebar has a subgroup sidebar.
]]
local function hasSubgroup(s)
if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then
return true
else
return false
end
end
local function has_navbar(navbar_mode, sidebar_name)
return navbar_mode ~= cfg.i18n.navbar_none and
navbar_mode ~= cfg.i18n.navbar_off and
(
sidebar_name or
mw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~=
cfg.i18n.title_not_to_add_navbar
)
end
local function has_list_class(args, htmlclass)
local patterns = {
'^' .. htmlclass .. '$',
'%s' .. htmlclass .. '$',
'^' .. htmlclass .. '%s',
'%s' .. htmlclass .. '%s'
}
for arg, value in pairs(args) do
if type(arg) == 'string' and mw.ustring.find(arg, 'class') then
for _, pattern in ipairs(patterns) do
if mw.ustring.find(args[arg] or '', pattern) then
return true
end
end
end
end
return false
end
-- there are a lot of list classes in the wild, so we add their TemplateStyles
local function add_list_styles(args)
local frame = mw.getCurrentFrame()
local function add_list_templatestyles(htmlclass, templatestyles)
if has_list_class(args, htmlclass) then
return frame:extensionTag{
name = 'templatestyles', args = { src = templatestyles }
}
else
return ''
end
end
local plainlist_styles = add_list_templatestyles('plainlist', cfg.i18n.plainlist_templatestyles)
local hlist_styles = add_list_templatestyles('hlist', cfg.i18n.hlist_templatestyles)
-- a second workaround for [[phab:T303378]]
-- when that issue is fixed, we can actually use has_navbar not to emit the
-- tag here if we want
if has_navbar(args.navbar, args.name) and hlist_styles == '' then
hlist_styles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.hlist_templatestyles}
}
end
-- hlist -> plainlist is best-effort to preserve old Common.css ordering. [hlist_note]
return hlist_styles .. plainlist_styles
end
-- work around [[phab:T303378]]
-- for each arg: find all the templatestyles strip markers, insert them into a
-- table. then remove all templatestyles markers from the arg
local function move_hiding_templatestyles(args)
local gfind = string.gfind
local gsub = string.gsub
local templatestyles_markers = {}
local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'
for k, arg in pairs(args) do
for marker in gfind(arg, strip_marker_pattern) do
table.insert(templatestyles_markers, marker)
end
args[k] = gsub(arg, strip_marker_pattern, '')
end
return templatestyles_markers
end
--[[
Main sidebar function. Takes the frame, args, and an optional collapsibleClass.
The collapsibleClass is and should be used only for sidebars with collapsible
lists, as in p.collapsible.
]]
function p.sidebar(frame, args, collapsibleClass)
if not args then
args = getArgs(frame)
end
local hiding_templatestyles = table.concat(move_hiding_templatestyles(args))
local root = mw.html.create()
local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes
root = root:tag('table')
if not child then
root
:addClass(cfg.i18n.class.sidebar)
-- force collapsibleclass to be sidebar-collapse otherwise output nothing
:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil)
:addClass('nomobile')
:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil)
:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil)
:addClass(args.wraplinks ~= cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil)
:addClass(args.bodyclass or args.class)
:css('width', args.width or nil)
:cssText(args.bodystyle or args.style)
if args.outertitle then
root
:tag('caption')
:addClass(cfg.i18n.class.outer_title)
:addClass(args.outertitleclass)
:cssText(args.outertitlestyle)
:wikitext(args.outertitle)
end
if args.topimage then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.top_image)
:addClass(args.topimageclass)
:cssText(args.topimagestyle)
:wikitext(args.topimage)
if args.topcaption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.top_caption)
:cssText(args.topcaptionstyle)
:wikitext(args.topcaption)
end
end
if args.pretitle then
root
:tag('tr')
:tag('td')
:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image
or cfg.i18n.class.pretitle)
:addClass(args.pretitleclass)
:cssText(args.basestyle)
:cssText(args.pretitlestyle)
:wikitext(args.pretitle)
end
else
root
:addClass(cfg.i18n.class.subgroup)
:addClass(args.bodyclass or args.class)
:cssText(args.bodystyle or args.style)
end
if args.title then
if child then
root
:wikitext(args.title)
else
root
:tag('tr')
:tag('th')
:addClass(args.pretitle and cfg.i18n.class.title_with_pretitle
or cfg.i18n.class.title)
:addClass(args.titleclass)
:cssText(args.basestyle)
:cssText(args.titlestyle)
:wikitext(args.title)
end
end
if args.image then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.image)
:addClass(args.imageclass)
:cssText(args.imagestyle)
:wikitext(args.image)
if args.caption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.caption)
:cssText(args.captionstyle)
:wikitext(args.caption)
end
end
if args.above then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.above)
:addClass(args.aboveclass)
:cssText(args.abovestyle)
:newline() -- newline required for bullet-points to work
:wikitext(args.above)
end
local rowNums = {}
for k, v in pairs(args) do
k = '' .. k
local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')
if num then table.insert(rowNums, tonumber(num)) end
end
table.sort(rowNums)
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3
-- and content3 are specified)
for i = #rowNums, 1, -1 do
if rowNums[i] == rowNums[i - 1] then
table.remove(rowNums, i)
end
end
for i, num in ipairs(rowNums) do
local heading = args['heading' .. num]
if heading then
root
:tag('tr')
:tag('th')
:addClass(cfg.i18n.class.heading)
:addClass(args.headingclass)
:addClass(args['heading' .. num .. 'class'])
:cssText(args.basestyle)
:cssText(args.headingstyle)
:cssText(args['heading' .. num .. 'style'])
:newline()
:wikitext(heading)
end
local content = args['content' .. num]
if content then
root
:tag('tr')
:tag('td')
:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup
or cfg.i18n.class.content)
:addClass(args.contentclass)
:addClass(args['content' .. num .. 'class'])
:cssText(args.contentstyle)
:cssText(args['content' .. num .. 'style'])
:newline()
:wikitext(content)
:done()
-- Without a linebreak after the </td>, a nested list like
-- "* {{hlist| ...}}" doesn't parse correctly.
:newline()
end
end
if args.below then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.below)
:addClass(args.belowclass)
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
if not child and has_navbar(args.navbar, args.name) then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.navbar)
:cssText(args.navbarstyle)
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle
})
end
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
}
local templatestyles = ''
if args['templatestyles'] and args['templatestyles'] ~= '' then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] and args['child templatestyles'] ~= '' then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
add_list_styles(args), -- see [hlist_note] above about ordering
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles,
hiding_templatestyles,
tostring(root),
(child and cfg.i18n.category.child or ''),
categorizeTemplatesWithInlineStyles(args)
})
end
local function list_title(args, is_centered_list_titles, num)
local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title']
or cfg.i18n.default_list_title)
local title
if is_centered_list_titles then
-- collapsible can be finicky, so provide some CSS/HTML to support
title = mw.html.create('div')
:addClass(cfg.i18n.class.list_title_centered)
:wikitext(title_text)
else
title = mw.html.create()
:wikitext(title_text)
end
local title_container = mw.html.create('div')
:addClass(cfg.i18n.class.list_title)
-- don't /need/ a listnumtitleclass because you can do
-- .templateclass .listnumclass .sidebar-list-title
:addClass(args.listtitleclass)
:cssText(args.basestyle)
:cssText(args.listtitlestyle)
:cssText(args['list' .. num .. 'titlestyle'])
:node(title)
:done()
return title_container
end
--[[
Main entry point for sidebar with collapsible lists.
Does the work of creating the collapsible lists themselves and including them
into the args.
]]
function p.collapsible(frame)
local args = getArgs(frame)
if not args.name and
frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') ==
cfg.i18n.collapse_title_not_to_add_navbar then
args.navbar = cfg.i18n.navbar_none
end
local contentArgs = {}
local is_centered_list_titles = false
if args['centered list titles'] and args['centered list titles'] ~= '' then
is_centered_list_titles = true
end
for k, v in pairs(args) do
local num = string.match(k, '^list(%d+)$')
if num then
local expand = args.expanded and
(args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])
local row = mw.html.create('div')
row
:addClass(cfg.i18n.class.list)
:addClass('mw-collapsible')
:addClass((not expand) and 'mw-collapsed' or nil)
:addClass(args['list' .. num .. 'class'])
:cssText(args.listframestyle)
:cssText(args['list' .. num .. 'framestyle'])
:node(list_title(args, is_centered_list_titles, num))
:tag('div')
:addClass(cfg.i18n.class.list_content)
:addClass('mw-collapsible-content')
-- don't /need/ a listnumstyleclass because you can do
-- .templatename .listnumclass .sidebar-list
:addClass(args.listclass)
:cssText(args.liststyle)
:cssText(args['list' .. num .. 'style'])
:wikitext(trimAndAddAutomaticNewline(args['list' .. num]))
contentArgs['content' .. num] = tostring(row)
end
end
for k, v in pairs(contentArgs) do
args[k] = v
end
return p.sidebar(frame, args, cfg.i18n.class.collapse)
end
return p
71fe765846593e025ca2f94371315e9dbb5bb4d2
Module:Sidebar/doc
828
137
154
2023-10-08T09:21:21Z
Silentg
2
Created page with "{{High-risk|155000+}} {{module rating|protected}} {{Lua|Module:Sidebar/configuration|Module:Navbar|Module:Arguments}} {{Uses TemplateStyles|Module:Sidebar/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module implements the templates {{tl|sidebar}} and {{tl|sidebar with collapsible lists}}. See the individual template pages for documentation. <includeonly>{{sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> Category..."
wikitext
text/x-wiki
{{High-risk|155000+}}
{{module rating|protected}}
{{Lua|Module:Sidebar/configuration|Module:Navbar|Module:Arguments}}
{{Uses TemplateStyles|Module:Sidebar/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}}
This module implements the templates {{tl|sidebar}} and {{tl|sidebar with collapsible lists}}. See the individual template pages for documentation.
<includeonly>{{sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Sidebar meta-templates| ]]
[[Category:Modules that add a tracking category]]
[[Category:Modules that check for strip markers]]
}}</includeonly>
710222793e9c5fe515b611d11ddac712a409e814
Module:Sidebar/configuration
828
138
155
2023-10-08T09:21:57Z
Silentg
2
Created page with "return { i18n = { child_yes = 'yes', float_none = 'none', float_left = 'left', wrap_true = 'true', navbar_none = 'none', navbar_off = 'off', default_list_title = 'List', title_not_to_add_navbar = 'Template:Sidebar', collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists', templatestyles = 'Module:Sidebar/styles.css', hlist_templatestyles = 'Hlist/styles.css', plainlist_templatestyles = 'Plainlist/styles.css', category = {..."
Scribunto
text/plain
return {
i18n = {
child_yes = 'yes',
float_none = 'none',
float_left = 'left',
wrap_true = 'true',
navbar_none = 'none',
navbar_off = 'off',
default_list_title = 'List',
title_not_to_add_navbar = 'Template:Sidebar',
collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists',
templatestyles = 'Module:Sidebar/styles.css',
hlist_templatestyles = 'Hlist/styles.css',
plainlist_templatestyles = 'Plainlist/styles.css',
category = {
child = '[[Category:Pages using sidebar with the child parameter]]',
conversion = '[[Category:Sidebars with styles needing conversion]]'
},
pattern = {
collapse_sandbox = '/sandbox$',
sandbox = '/sandbox$',
subgroup = 'sidebar%-subgroup',
style_conversion = 'style$',
uncategorized_conversion_titles = {
'/[Ss]andbox',
'/[Tt]estcases',
'/[Dd]oc$'
}
},
class = {
sidebar = 'sidebar',
subgroup = 'sidebar-subgroup',
collapse = 'sidebar-collapse',
float_none = 'sidebar-none',
float_left = 'sidebar-left',
wraplinks = 'nowraplinks',
outer_title = 'sidebar-outer-title',
top_image = 'sidebar-top-image',
top_caption = 'sidebar-top-caption',
pretitle = 'sidebar-pretitle',
pretitle_with_top_image = 'sidebar-pretitle-with-top-image',
title = 'sidebar-title',
title_with_pretitle = 'sidebar-title-with-pretitle',
image = 'sidebar-image',
caption = 'sidebar-caption',
above = 'sidebar-above',
heading = 'sidebar-heading',
content = 'sidebar-content',
content_with_subgroup = 'sidebar-content-with-subgroup',
below = 'sidebar-below',
navbar = 'sidebar-navbar',
list = 'sidebar-list',
list_title = 'sidebar-list-title',
list_title_centered = 'sidebar-list-title-c',
list_content = 'sidebar-list-content'
}
}
}
dc2a980ac2162a898f7c21e6d6ba7e994dfeb315
Module:Sidebar/styles.css
828
139
156
2023-10-08T09:23:28Z
Silentg
2
Created page with "/* {{pp-template}} */ /* TODO: Invert width design to be "mobile first" */ .sidebar { /* TODO: Ask if we should have max-width 22em instead */ width: 22em; /* @noflip */ float: right; /* @noflip */ clear: right; /* @noflip */ margin: 0.5em 0 1em 1em; background: #f8f9fa; border: 1px solid #aaa; padding: 0.2em; text-align: center; line-height: 1.4em; font-size: 88%; border-collapse: collapse; /* Timeless has display: none on .nomobile at mobile resolutions..."
sanitized-css
text/css
/* {{pp-template}} */
/* TODO: Invert width design to be "mobile first" */
.sidebar {
/* TODO: Ask if we should have max-width 22em instead */
width: 22em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
/* @noflip */
margin: 0.5em 0 1em 1em;
background: #f8f9fa;
border: 1px solid #aaa;
padding: 0.2em;
text-align: center;
line-height: 1.4em;
font-size: 88%;
border-collapse: collapse;
/* Timeless has display: none on .nomobile at mobile resolutions, so we
* unhide it with display: table and let precedence and proximity win.
*/
display: table;
}
/* Unfortunately, so does Minerva desktop, except Minerva drops an
* !important on the declaration. So we have to be mean for Minerva users.
* Mobile removes the element entirely with `wgMFRemovableClasses` in
* https://github.com/wikimedia/operations-mediawiki-config/blob/master/
wmf-config/InitialiseSettings.php#L16992
* which is why displaying it categorically with display: table works.
* We don't really want to expose the generic user in the wild on mobile to have
* to deal with sidebars. (Maybe the ones with collapsible lists, so that
* might be an improvement. That is blocked on [[:phab:T111565]].)
*/
body.skin-minerva .sidebar {
display: table !important;
/* also, minerva is way too aggressive about other stylings on tables.
* TODO remove when this template gets moved to a div. plans on talk page.
* We always float right on Minerva because that's a lot of extra CSS
* otherwise. */
float: right !important;
margin: 0.5em 0 1em 1em !important;
}
.sidebar-subgroup {
width: 100%;
margin: 0;
border-spacing: 0;
}
.sidebar-left {
/* @noflip */
float: left;
/* @noflip */
clear: left;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-none {
float: none;
clear: both;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-outer-title {
padding: 0 0.4em 0.2em;
font-size: 125%;
line-height: 1.2em;
font-weight: bold;
}
.sidebar-top-image {
padding: 0.4em;
}
.sidebar-top-caption,
.sidebar-pretitle-with-top-image,
.sidebar-caption {
padding: 0.2em 0.4em 0;
line-height: 1.2em;
}
.sidebar-pretitle {
padding: 0.4em 0.4em 0;
line-height: 1.2em;
}
.sidebar-title,
.sidebar-title-with-pretitle {
padding: 0.2em 0.8em;
font-size: 145%;
line-height: 1.2em;
}
.sidebar-title-with-pretitle {
padding: 0.1em 0.4em;
}
.sidebar-image {
padding: 0.2em 0.4em 0.4em;
}
.sidebar-heading {
padding: 0.1em 0.4em;
}
.sidebar-content {
padding: 0 0.5em 0.4em;
}
.sidebar-content-with-subgroup {
padding: 0.1em 0.4em 0.2em;
}
.sidebar-above,
.sidebar-below {
padding: 0.3em 0.8em;
font-weight: bold;
}
.sidebar-collapse .sidebar-above,
.sidebar-collapse .sidebar-below {
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
}
.sidebar-navbar {
text-align: right;
font-size: 115%;
padding: 0 0.4em 0.4em;
}
.sidebar-list-title {
padding: 0 0.4em;
text-align: left;
font-weight: bold;
line-height: 1.6em;
font-size: 105%;
}
/* centered text with mw-collapsible headers is finicky */
.sidebar-list-title-c {
padding: 0 0.4em;
text-align: center;
margin: 0 3.3em;
}
@media (max-width: 720px) {
/* users have wide latitude to set arbitrary width and margin :(
"Super-specific" selector to prevent overriding this appearance by
lower level sidebars too */
body.mediawiki .sidebar {
width: 100% !important;
clear: both;
float: none !important; /* Remove when we div based; Minerva is dumb */
margin-left: 0 !important;
margin-right: 0 !important;
}
/* TODO: We might consider making all links wrap at small resolutions and then
* only introduce nowrap at higher resolutions. Do when we invert the media
* query.
*/
}
7d621b35a37807a103b59075851fe36201204ceb
User:Silentg/sandbox
2
80
157
96
2023-10-08T09:32:26Z
Silentg
2
wikitext
text/x-wiki
{{Infobox
|name = Infobox/doc
|bodystyle = width:20em
|titlestyle =
|title = Test Infobox
|headerstyle =
|labelstyle = width:33%
|datastyle =
|header1 =
| label1 = Label 1
| data1 = Data 1
|header2 =
| label2 = Label 2
| data2 = Data 2
|header3 =
| label3 = Label 3
| data3 = Data 3
|header4 = Header 4
| label4 =
| data4 =
|header5 =
| label5 = Label 5
| data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|belowstyle =
|below = Below text
}}
c4c20ed5340f6ae1f9d0d082427d36c5647d799d
MediaWiki:Common.css
8
140
158
2023-10-08T09:35:05Z
Silentg
2
Created page with "/* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-da..."
css
text/css
/* CSS placed here will be applied to all skins */
/* vvv Move to TemplateStyles when WP does vvv */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
813e35932daf7e0664ecf574cd23597074b79f45
Template:Tlg/doc
10
141
159
2023-10-08T09:51:58Z
Silentg
2
Redirected page to [[Template:Template link general/doc]]
wikitext
text/x-wiki
#REDIRECT [[Template:Template link general/doc]]
{{Redirect category shell|
{{R from move}}
}}
a63e5d7ae3ef1cf01f91aefa893333ab9aa84899
Template:Talk other
10
142
160
2023-10-08T09:53:56Z
Silentg
2
Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}} | talk | other }} }} | talk = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} </noinclude>"
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}
| talk
| other
}}
}}
| talk = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
</noinclude>
a8a973e372c5984a59953eb0cb4767a03dc6cd3c
Template:Talk other/doc
10
143
161
2023-10-08T09:55:37Z
Silentg
2
Created page with "{{Documentation subpage}} {{High-risk| 143933 }} <!--Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])--> This is the {{tl|talk other}} meta-template. This template helps other templates detect if they are on a talk page or some "other" type of page. == Usage == This template usually takes two parameters, like this: <syntaxhighlight lang="wikitext"> {{talk other | Talk pages text | Other pages text }} <..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-risk| 143933 }}
<!--Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])-->
This is the {{tl|talk other}} meta-template.
This template helps other templates detect if they are on a talk page or some "other" type of page.
== Usage ==
This template usually takes two parameters, like this:
<syntaxhighlight lang="wikitext">
{{talk other | Talk pages text | Other pages text }}
</syntaxhighlight>
If the template is on any talk page, it will return this:
:{{talk other | demospace=talk | Talk pages text | Other pages text }}
If the template is on any other page, it will return this:
:{{talk other | Talk page text | Other pages text }}
A typical usage case could be to make it so that a template only adds a category when on talk pages. Thus not adding other pages that just show the template. Like this:
<syntaxhighlight lang="wikitext">
{{talk other | [[Category:Some talk page category]] }}
</syntaxhighlight>
Or to warn that a template should not be used on other pages:
<syntaxhighlight lang="wikitext">
{{talk other | | This template should only be used on talk pages. }}
</syntaxhighlight>
Note that in the first case above the "other" parameter was not used, and in the second example the "talk" parameter was left empty.
== Demospace ==
For testing and demonstration purposes this template can take a parameter named '''demospace'''.
* If it has the value '''talk''' it returns the talk pages text.
* It if has the value '''other''' or any other value such as the name of some other namespace it returns the other pages text.
* If the parameter is empty or undefined, the actual page type determines the result.
Like this:
<syntaxhighlight lang="wikitext">
{{talk other
| Talk pages text
| Other pages text
| demospace = talk
}}
</syntaxhighlight>
No matter on what kind of page the code above is used it will return this:
:{{talk other
| Talk pages text
| Other pages text
| demospace = talk
}}
You can make it so your template also understands the '''demospace''' parameter. That means you can demonstrate the different appearances of your template in the documentation for your template. Then do like this:
<syntaxhighlight lang="wikitext">
{{talk other
| Talk pages text
| Other pages text
| demospace = {{{demospace|}}}
}}
</syntaxhighlight>
== Technical details ==
This template detects all types of talk pages as type '''talk'''. That is, "Talk:", "User talk:", "File talk:" and so on are all of type '''talk'''.
This template works like {{tl|main talk other}}, for more examples and technical details see full documentation there.
{{Namespace and pagename-detecting templates}}
<includeonly>{{Sandbox other|
| <!--Categories below this line, please; interwikis at Wikidata-->
[[Category:Namespace manipulation templates]]
[[Category:Talk namespace templates]]
}}</includeonly>
4fd6392f9a52601948987b1c19e9e20871137ec6
Template:Cat
10
144
162
2023-10-08T09:57:14Z
Silentg
2
Created page with "[[:Category:{{PAGENAME:{{{1}}}}}]]<noinclude> {{documentation}} </noinclude>"
wikitext
text/x-wiki
[[:Category:{{PAGENAME:{{{1}}}}}]]<noinclude>
{{documentation}}
</noinclude>
1bc496e43140b2151295691ec72e6d251bb0b6cb
Template:Cat/doc
10
145
163
2023-10-08T09:58:30Z
Silentg
2
Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> === Usage === Creates a link to the specified category. Canonalizes the displayed category name. '''Example:''' * {{tlx|Cat|Stubs}} → {{Cat|Stubs}} * {{tlx|Cat|stubs}} → {{Cat|stubs}} * {{tlx|Cat|cat:stubs}} → {{Cat|Category:stubs}} * {{tlx|Cat|category:stubs}} → {{Cat|Category:stubs}} === See also === * {{tl|c}} – pipetricked category name – skips 'Categ..."
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE -->
=== Usage ===
Creates a link to the specified category. Canonalizes the displayed category name.
'''Example:'''
* {{tlx|Cat|Stubs}} → {{Cat|Stubs}}
* {{tlx|Cat|stubs}} → {{Cat|stubs}}
* {{tlx|Cat|cat:stubs}} → {{Cat|Category:stubs}}
* {{tlx|Cat|category:stubs}} → {{Cat|Category:stubs}}
=== See also ===
* {{tl|c}} – pipetricked category name – skips 'Category:' and displays bare link.
* {{tl|cl}} – links to category and includes the 'Category:' label
* {{tl|cls}} – compromise macro between 'C' and 'Cat': <nowiki>[[:Category:{{{1}}}|Cat:{{{1}}}]]</nowiki>
* {{tl|catlist}} – list of many, variable output format
* {{tl|cat see also}} – list of many, fixed output format for a category-namespace hatnote
'''With administration links:'''
* {{tl|lc}} – Category name and full links – for administration and discussion pages
* {{tl|lcs}} – Category name and '''s'''maller set of links – same purposes, <br />but note, both are useful from within preview screens as well to explore and study relationships, or make related changes.
<includeonly>{{sandbox other||
[[Category:Internal category-link templates]]
}}</includeonly>
aed0cd48d61554becf03fe81b01ddbec48bca004
Template:Userbox
10
146
164
2023-10-08T10:05:44Z
Silentg
2
Created page with "{{#invoke:userbox|userbox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>"
wikitext
text/x-wiki
{{#invoke:userbox|userbox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
43f31821f815f586868b4e5ea3e7116d7b972f58
Template:Userbox/doc
10
147
165
2023-10-08T10:06:26Z
Silentg
2
Created page with "{{Documentation subpage}} {{Lua|Module:Userbox}} {{High-use}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> This template can be used to quickly create a [[Wikipedia:Userboxes|userbox]] for display on a user's [[Wikipedia:User pages|user page]] without having to know HTML or Wikitable syntax. '''''[[WP:NFCC|Nonfree]] images must not be displayed in userboxes, and are subject to summary removal by any editor without any notice being re..."
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:Userbox}}
{{High-use}}
<!-- Categories go at the bottom of this page and interwikis go in Wikidata. -->
This template can be used to quickly create a [[Wikipedia:Userboxes|userbox]] for display on a user's [[Wikipedia:User pages|user page]] without having to know HTML or Wikitable syntax.
'''''[[WP:NFCC|Nonfree]] images must not be displayed in userboxes, and are subject to summary removal by any editor without any notice being required.'''''
== Sandbox reminder==
* Always practice or experiment in the [[Template:Userbox/sandbox]] or [[Template:Userbox/testcases]]
* Once you are satisfied: Copy your code!
* In your Browser's address bar, change "sandbox" or "testcases" to the name of your new Userbox.
** Example:
** '''CHANGE''' [{{Fullurl:Template:Userbox/sandbox}} http://en.wikipedia.org/wiki/Template:Userbox/sandbox]<!--Display http://, but allow possibility of https:// access.-->
** '''TO''' [{{Fullurl:Template:Userbox/sandbox}} https://en.wikipedia.org/wiki/Template:Userbox/WhateverYourNewBoxNameIs]
** If the name of your new Userbox is taken, create a different name.
* You will be prompted to Start or Create your new Template Userbox!
* Paste your code into the space provided.
== Usage ==
<!-- Abstract usage of the template, one variable per row. -->
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{userbox
| bodyclass = <!--Adds an HTML class attribute to the entire template's HTML table, to allow for styling, emission of microformats, etc.-->
| border-c = <!--border color (default=id-c or #999999)-->
| border-s = <!--border width in pixels (default=1)-->
| float = <!--left|right|none (default=left)-->
| id = <!--id image or text (image size should normally not exceed 90x45px)-->
| id-a = <!--id horizontal alignment left/center/right/justify (default=center)-->
| id-c = <!--id background color (default=#DDDDDD)-->
| id-fc = <!--id font color (default=info-fc or black)-->
| id-h = <!--id box height in pixels (default=45)-->
| id-lh = <!--id line height (default=1.25em)-->
| id-op = <!--id other CSS parameters-->
| id-p = <!--id cell padding (default=0 1px 0 0)-->
| id-s = <!--id text size in points (default=14)-->
| id-w = <!--id box width in pixels (default=45)-->
| info-class = <!--Adds an HTML class attribute to the "info" HTML table-row, to allow for styling, emission of microformats, etc.-->
| info = <!--info text or image-->
| info-a = <!--info horizontal alignment left/center/right/justify (default=left)-->
| info-c = <!--info background color (default=#EEEEEE)-->
| info-fc = <!--info font color (default=black)-->
| info-lh = <!--info line height (default=1.25em)-->
| info-op = <!--info other CSS parameters-->
| info-p = <!--info padding (default=0 4px 0 4px)-->
| info-s = <!--info text size in points (default=8)-->
| nocat = <!--block page category declarations; see [[WP:NOCAT]] (default=false)-->
| usercategory = <!--user category (optional, unlinked and without the "Category:" part)-->
| usercategory2 = <!--user category (optional)-->
| usercategory3 = <!--user category (optional)-->
| usercategory4 = <!--user category (optional)-->
| usercategory5 = <!--user category (optional)-->
}}
</syntaxhighlight>
* All parameters are optional.
* Images should normally be scaled to x45px or less.
<!-- Explain what this template's parameters do -- if no params, delete the definition. -->
Most HTML-based tables use only a handful of these attributes. The following subset can be used to quickly convert an HTML userbox into the format used here:
<syntaxhighlight lang="wikitext">
{{userbox
| border-c =
| id =
| id-c =
| id-fc =
| id-s =
| info =
| info-c =
| info-fc =
| info-lh =
| info-s =
}}</syntaxhighlight>
== Examples ==
{|
! style="width: 300px;" | Code
! Result
|-
| <syntaxhighlight lang="wikitext">{{userbox
| border-c = #aaffaa
| border-s = 2
| id = foo
| id-c = #ffffee
| id-s = 20
| info = ''foo bar''
| info-c = #ffeeff
| info-s = 12
}}</syntaxhighlight> || {{userbox|id=foo|id-s=20|id-c=#ffffee|info=''foo bar''|info-c=#ffeeff|info-s=12|border-c=#aaffaa|border-s=2}}
|-
| colspan="2"| Below example shows the default appearance of a userbox, which is (much) higher than the 45px.<br>Compare the height of the one below with the above userbox.
|-
| <syntaxhighlight lang="wikitext">{{userbox
| border-c = #aaffaa
| border-s = 2
| id = foo logo
| id-c = #ffffee
| info = ''We are trying to see
default distance in between text
lines, see the distance in
between cell content and its border,
and also see total height.''
| info-c = #ffeeff
}}</syntaxhighlight> || {{userbox|id=foo logo|id-c=#ffffee|info=''We are trying to see default distance in between text lines, see the distance in between cell content and its border, and also see total height.''|info-c=#ffeeff|border-c=#aaffaa|border-s=2}}
|-
| colspan="2"| Below example shows how we can change that userbox and further specify parameters to bring down<br>the overall height of the userbox to the recommended height of 45px, even with four text lines.<br>Cell padding parameter "''info-p''" can also be set at "''1pt 1pt 1pt 2pt''", or "''1pt 2pt''" for better appearance,<br>when there are 4 text lines.
|-
| <syntaxhighlight lang="wikitext">{{userbox
| border-c = #aaffaa
| border-s = 1
| id = foo logo
| id-c = #ffffee
| id-lh = 1.1em
| id-s = 14
| info = ''We have specified values
to lessen the distance between
text lines and padding space between
cell content and its border.''
| info-c = #ffeeff
| info-lh = 1.05em
| info-p = 1pt
| info-s = 8
}}</syntaxhighlight> || {{userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffffee|info=''We have specified values to lessen the distance between text lines and padding space between cell content and its border.''|info-c=#ffeeff|info-s=8|info-p=1pt|info-lh=1.05em|border-c=#aaffaa|border-s=1}}
|-
| colspan="2"| Below example is for advanced users, showing how we can specify other [[Cascading Style Sheets|CSS]] properties,for example, "''font-family''",<br>to change the font or "''text-decoration''" to add lines around the text. Below, on the right side are two userboxes:<br>the top one is displayed without either parameters; and the bottom userbox is displayed by using the below code,<br>with the help of the "''info-op''" field.
|-
| <syntaxhighlight lang="wikitext">{{userbox
| border-c = #afa
| border-s = 2
| id = foo logo
| id-c = #ffe
| id-lh = 1.1em
| id-s = 14
| info = foo bar
| info-c = #fef
| info-op = font-family: 'Courier New', monospace; text-decoration: wavy overline green;
| info-s = 14
}}</syntaxhighlight> || colspan="2"| {{Userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffe|info=foo bar|info-c=#fef|info-s=14|border-c=#afa|border-s=2}} <br style="clear:both"> <br /> {{Userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffe|info=foo bar|info-c=#fef|info-s=14|info-op=font-family: 'Courier New', monospace; text-decoration: wavy overline green;|border-c=#afa|border-s=2}}
|}
==Microformats==
; bodyclass : This parameter is inserted into the "class" attribute for the userbox as a whole.
; info-class : This parameter is inserted into the "class" attribute for the info component.
This template supports the addition of [[microformat]] information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. To flag a userbox as containing [[hCard]] information about a person, for example, add the following parameter:
<syntaxhighlight lang="wikitext">
| bodyclass = vcard
</syntaxhighlight>
''or''
<syntaxhighlight lang="wikitext">
| info-class = vcard
</syntaxhighlight>
''then'' (for example):
<syntaxhighlight lang="wikitext"><nowiki>
| title = …the books of <span class="fn">[[Iain Banks]]</span>
</nowiki></syntaxhighlight>
...and so forth.
Examples include:
* <code>{{tlu|User:UBX/Iain Banks}}</code> - person
* {{tlx|User Microformats}} - group (WikiProject Microformats)
* {{tlx|User Brum}} - place (Birmingham)
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia.
== Template Data ==
{{TemplateData header}}
<TemplateData>{
"description": "This template can be used to quickly create a userbox for display on a user's user page without having to know HTML or Wikitable syntax.",
"params": {
"bodyclass": {
"label": "Body class",
"description": "Adds an HTML class attribute to the entire template's HTML table, to allow for styling, emission of microformats, etc.",
"type": "string",
"required": false
},
"border-c": {
"label": "Border color",
"description": "Color of the outer border",
"type": "string",
"default": "#999",
"required": false,
"aliases": [
"border-color"
]
},
"border-s": {
"label": "Border width",
"description": "border width in pixels",
"type": "number",
"default": "1",
"required": false,
"aliases": [
"border-width"
]
},
"float": {
"label": "Float",
"description": "left|right|none",
"type": "string",
"default": "left",
"required": false,
"suggestedvalues": [
"left",
"right",
"none"
]
},
"id": {
"label": "Logo",
"description": "id image or text",
"type": "content",
"required": false,
"aliases": [
"3",
"logo"
],
"suggested": true
},
"id-a": {
"label": "Logo content horizontal alignment",
"description": "Horizontal alignment of logo content; left/center/right/justify",
"type": "string",
"default": "center",
"required": false,
"suggestedvalues": [
"left",
"center",
"right",
"justify"
]
},
"id-c": {
"label": "id-c",
"description": "Two-in-one alias for border color and logo background color. Lower priority than border-c and logo-background",
"type": "string",
"required": false,
"aliases": [
"1"
],
"example": "#d0d0d0"
},
"id-fc": {
"label": "Logo font color",
"description": "Logo font color; if not specified, defaults to info font color",
"type": "string",
"default": "black",
"required": false,
"aliases": [
"logo-color"
]
},
"id-h": {
"label": "Logo height",
"description": "Logo box height in pixels",
"type": "number",
"default": "45",
"required": false,
"aliases": [
"logo-height"
]
},
"id-lh": {
"label": "Logo line height",
"description": "Logo line height",
"type": "string",
"default": "1.25em",
"required": false,
"aliases": [
"logo-line-height"
]
},
"id-op": {
"label": "Extra logo styling",
"description": "Add additional arbitrary CSS styling to the logo",
"type": "string",
"required": false,
"aliases": [
"logo-other-param"
],
"example": "opacity: 0.25"
},
"id-p": {
"label": "Logo padding",
"description": "Logo cell padding",
"type": "string",
"default": "0 1px 0 0",
"required": false,
"aliases": [
"logo-padding"
]
},
"id-s": {
"label": "Logo font size",
"description": "Logo text size in points",
"type": "string",
"default": "14",
"required": false,
"aliases": [
"5",
"logo-size"
]
},
"id-w": {
"label": "Logo width",
"description": "id box width in pixels",
"type": "number",
"default": "45",
"required": false,
"aliases": [
"logo-width"
]
},
"info-class": {
"label": "Info CSS classes",
"description": "Adds an HTML class attribute to the \"info\" HTML table-row, to allow for styling, emission of microformats, etc.",
"type": "string",
"required": false
},
"info": {
"label": "Info",
"description": "info text or image",
"type": "content",
"required": true,
"aliases": [
"4"
]
},
"info-a": {
"label": "Info content horizontal alignment",
"description": "Horizontal alignment of info content; left/center/right/justify",
"type": "string",
"default": "left",
"required": false,
"suggestedvalues": [
"left",
"center",
"right",
"justify"
]
},
"info-c": {
"label": "Info background color",
"description": "Info background color",
"type": "string",
"default": "#e0e0e0",
"required": false,
"aliases": [
"2",
"info-background"
]
},
"info-fc": {
"label": "Info font color",
"description": "info font color",
"type": "string",
"default": "black",
"required": false,
"aliases": [
"info-color"
]
},
"info-lh": {
"label": "Info line height",
"description": "Info line height",
"type": "string",
"default": "1.25em",
"required": false,
"aliases": [
"info-line-height"
]
},
"info-op": {
"label": "Extra info styling",
"description": "Add additional arbitrary CSS styling to the info",
"type": "string",
"required": false,
"aliases": [
"info-other-param"
],
"example": "opacity: 0.25"
},
"info-p": {
"label": "Info padding",
"description": "info padding",
"type": "string",
"default": "0 4px 0 4px",
"required": false,
"aliases": [
"info-padding"
]
},
"info-s": {
"label": "Info font size",
"description": "info text size in points",
"type": "number",
"default": "8",
"required": false,
"aliases": [
"info-size"
]
},
"nocat": {
"label": "nocat",
"description": "block page category declarations (see WP:NOCAT)",
"type": "string",
"default": "false",
"required": false
},
"usercategory": {
"label": "usercategory",
"description": "user category (optional)",
"type": "string",
"required": false
},
"usercategory2": {
"label": "usercategory2",
"description": "user category (optional)",
"type": "string",
"required": false
},
"usercategory3": {
"label": "usercategory3",
"description": "user category (optional)",
"type": "string",
"required": false
},
"usercategory4": {
"label": "usercategory4",
"description": "user category (optional)",
"type": "string",
"required": false
},
"usercategory5": {
"label": "usercategory5",
"description": "user category (optional)",
"type": "string",
"required": false
},
"logo-background": {
"label": "Logo background color",
"description": "Background color of logo",
"type": "string",
"default": "#ddd"
},
"id-class": {
"label": "Logo CSS classes",
"description": "CSS class or classes for the logo; optional",
"type": "string",
"default": "(none)"
}
},
"format": "block",
"paramOrder": [
"bodyclass",
"float",
"border-c",
"border-s",
"id",
"id-a",
"logo-background",
"id-c",
"id-fc",
"id-h",
"id-s",
"id-lh",
"id-p",
"id-w",
"id-class",
"id-op",
"info",
"info-a",
"info-c",
"info-fc",
"info-lh",
"info-p",
"info-s",
"info-class",
"info-op",
"nocat",
"usercategory",
"usercategory2",
"usercategory3",
"usercategory4",
"usercategory5"
]
}</TemplateData>
==See also==
{{UBT}}
<includeonly>{{Sandbox other||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Userboxes|*]]
[[Category:User namespace templates]]
[[Category:Wikipedia metatemplates]]
}}</includeonly>
3b4eea4f8fc3ef69464386f3c3e9a0e08f76f0f6
Module:Userbox
828
148
166
2023-10-08T10:07:46Z
Silentg
2
Created page with "-- This module implements {{userbox}}. local categoryHandler = require('Module:Category handler').main local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function checkNum(val, default) -- Checks whether a value is a number greater than or equal to zero. If so, -- returns it as a number. If not, returns a default valu..."
Scribunto
text/plain
-- This module implements {{userbox}}.
local categoryHandler = require('Module:Category handler').main
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function checkNum(val, default)
-- Checks whether a value is a number greater than or equal to zero. If so,
-- returns it as a number. If not, returns a default value.
val = tonumber(val)
if val and val >= 0 then
return val
else
return default
end
end
local function addSuffix(num, suffix)
-- Turns a number into a string and adds a suffix.
if num then
return tostring(num) .. suffix
else
return nil
end
end
local function checkNumAndAddSuffix(num, default, suffix)
-- Checks a value with checkNum and adds a suffix.
num = checkNum(num, default)
return addSuffix(num, suffix)
end
local function makeCat(cat, sort)
-- Makes a category link.
if sort then
return mw.ustring.format('[[Category:%s|%s]]', cat, sort)
else
return mw.ustring.format('[[Category:%s]]', cat)
end
end
--------------------------------------------------------------------------------
-- Argument processing
--------------------------------------------------------------------------------
local function makeInvokeFunc(funcName)
return function (frame)
local origArgs = require('Module:Arguments').getArgs(frame)
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.main(funcName, args)
end
end
p.userbox = makeInvokeFunc('_userbox')
p['userbox-2'] = makeInvokeFunc('_userbox-2')
p['userbox-r'] = makeInvokeFunc('_userbox-r')
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.main(funcName, args)
local userboxData = p[funcName](args)
local userbox = p.render(userboxData)
local cats = p.categories(args)
return userbox .. (cats or '')
end
function p._userbox(args)
-- Does argument processing for {{userbox}}.
local data = {}
-- Get div tag values.
data.float = args.float or 'left'
local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width.
data.borderWidth = addSuffix(borderWidthNum, 'px')
data.borderColor = args['border-color'] or args['border-c'] or args[1] or args['id-c'] or '#999'
data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.
data.bodyClass = args.bodyclass
-- Get table tag values.
data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee'
-- Get info values.
data.info = args.info or args[4] or "<code>{{{info}}}</code>"
data.infoTextAlign = args['info-a'] or 'left'
data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt')
data.infoHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')
data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px'
data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em'
data.infoColor = args['info-color'] or args['info-fc'] or 'black'
data.infoOtherParams = args['info-other-param'] or args['info-op']
data.infoClass = args['info-class']
-- Get id values.
local id = args.logo or args[3] or args.id
data.id = id
data.showId = id and true or false
data.idWidth = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px')
data.idHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')
data.idBackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd'
data.idTextAlign = args['id-a'] or 'center'
data.idFontSize = checkNum(args['logo-size'] or args[5] or args['id-s'], 14)
data.idColor = args['logo-color'] or args['id-fc'] or data.infoColor
data.idPadding = args['logo-padding'] or args['id-p'] or '0 1px 0 0'
data.idLineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em'
data.idOtherParams = args['logo-other-param'] or args['id-op']
data.idClass = args['id-class']
return data
end
p['_userbox-2'] = function (args)
-- Does argument processing for {{userbox-2}}.
local data = {}
-- Get div tag values.
data.float = args.float or 'left'
local borderWidthNum = checkNum(args['border-s'] or args[9], 1) -- Used to calculate width.
data.borderWidth = addSuffix(borderWidthNum, 'px')
data.borderColor = args['border-c'] or args[6] or args['id1-c'] or args[1] or '#999999'
data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.
data.bodyClass = args.bodyclass
-- Get table tag values.
data.backgroundColor = args['info-c'] or args[2] or '#eeeeee'
-- Get info values.
data.info = args.info or args[4] or "<code>{{{info}}}</code>"
data.infoTextAlign = args['info-a'] or 'left'
data.infoFontSize = checkNumAndAddSuffix(args['info-s'], 8, 'pt')
data.infoColor = args['info-fc'] or args[8] or 'black'
data.infoPadding = args['info-p'] or '0 4px 0 4px'
data.infoLineHeight = args['info-lh'] or '1.25em'
data.infoOtherParams = args['info-op']
-- Get id values.
data.showId = true
data.id = args.logo or args[3] or args.id1 or 'id1'
data.idWidth = checkNumAndAddSuffix(args['id1-w'], 45, 'px')
data.idHeight = checkNumAndAddSuffix(args['id-h'], 45, 'px')
data.idBackgroundColor = args['id1-c'] or args[1] or '#dddddd'
data.idTextAlign = 'center'
data.idFontSize = checkNum(args['id1-s'], 14)
data.idLineHeight = args['id1-lh'] or '1.25em'
data.idColor = args['id1-fc'] or data.infoColor
data.idPadding = args['id1-p'] or '0 1px 0 0'
data.idOtherParams = args['id1-op']
-- Get id2 values.
data.showId2 = true
data.id2 = args.logo or args[5] or args.id2 or 'id2'
data.id2Width = checkNumAndAddSuffix(args['id2-w'], 45, 'px')
data.id2Height = data.idHeight
data.id2BackgroundColor = args['id2-c'] or args[7] or args[1] or '#dddddd'
data.id2TextAlign = 'center'
data.id2FontSize = checkNum(args['id2-s'], 14)
data.id2LineHeight = args['id2-lh'] or '1.25em'
data.id2Color = args['id2-fc'] or data.infoColor
data.id2Padding = args['id2-p'] or '0 0 0 1px'
data.id2OtherParams = args['id2-op']
return data
end
p['_userbox-r'] = function (args)
-- Does argument processing for {{userbox-r}}.
local data = {}
-- Get div tag values.
data.float = args.float or 'left'
local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width.
data.borderWidth = addSuffix(borderWidthNum, 'px')
data.borderColor = args['border-color'] or args['border-c'] or args[1] or args['id-c'] or '#999'
data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.
data.bodyClass = args.bodyclass
-- Get table tag values.
data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee'
-- Get id values.
data.showId = false -- We only show id2 in userbox-r.
-- Get info values.
data.info = args.info or args[4] or "<code>{{{info}}}</code>"
data.infoTextAlign = args['info-align'] or args['info-a'] or 'left'
data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt')
data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px'
data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em'
data.infoColor = args['info-color'] or args['info-fc'] or 'black'
data.infoOtherParams = args['info-other-param'] or args['info-op']
-- Get id2 values.
data.showId2 = true
data.id2 = args.logo or args[3] or args.id or 'id'
data.id2Width = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px')
data.id2Height = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')
data.id2BackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd'
data.id2TextAlign = args['id-a'] or 'center'
data.id2FontSize = checkNum(args['logo-size'] or args[5] or args['id-s'], 14)
data.id2Color = args['logo-color'] or args['id-fc'] or data.infoColor
data.id2Padding = args['logo-padding'] or args['id-p'] or '0 0 0 1px'
data.id2LineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em'
data.id2OtherParams = args['logo-other-param'] or args['id-op']
return data
end
function p.render(data)
-- Renders the userbox html using the content of the data table.
-- Render the div tag html.
local root = mw.html.create('div')
root
:css('float', data.float)
:css('border', (data.borderWidth or '') .. ' solid ' .. (data.borderColor or ''))
:css('margin', '1px')
:css('width', data.width)
:addClass('wikipediauserbox')
:addClass(data.bodyClass)
-- Render the table tag html.
local tableroot = root:tag('table')
tableroot
:attr('role', 'presentation')
:css('border-collapse', 'collapse')
:css('width', data.width)
:css('margin-bottom', '0')
:css('margin-top', '0')
:css('background', data.backgroundColor)
-- Render the id html.
local tablerow = tableroot:tag('tr')
if data.showId then
tablerow:tag('td')
:css('border', '0')
:css('width', data.idWidth)
:css('height', data.idHeight)
:css('background', data.idBackgroundColor)
:css('text-align', data.idTextAlign)
:css('font-size', data.idFontSize .. 'pt')
:css('font-weight', 'bold')
:css('color', data.idColor)
:css('padding', data.idPadding)
:css('line-height', data.idLineHeight)
:css('vertical-align', 'middle')
:cssText(data.idOtherParams)
:addClass(data.idClass)
:wikitext(data.id)
end
-- Render the info html.
tablerow:tag('td')
:css('border', '0')
:css('text-align', data.infoTextAlign)
:css('font-size', data.infoFontSize)
:css('padding', data.infoPadding)
:css('height', data.infoHeight)
:css('line-height', data.infoLineHeight)
:css('color', data.infoColor)
:css('vertical-align', 'middle')
:cssText(data.infoOtherParams)
:addClass(data.infoClass)
:wikitext(data.info)
-- Render the second id html.
if data.showId2 then
tablerow:tag('td')
:css('border', '0')
:css('width', data.id2Width)
:css('height', data.id2Height)
:css('background', data.id2BackgroundColor)
:css('text-align', data.id2TextAlign)
:css('font-size', data.id2FontSize .. 'pt')
:css('font-weight', 'bold')
:css('color', data.id2Color)
:css('padding', data.id2Padding)
:css('line-height', data.id2LineHeight)
:css('vertical-align', 'middle')
:cssText(data.id2OtherParams)
:wikitext(data.id2)
end
local title = mw.title.getCurrentTitle()
if (title.namespace == 2) and not title.text:match("/") then
return tostring(root) -- regular user page
elseif title.namespace == 14 then
return tostring(root) -- category
elseif title.isTalkPage then
return tostring(root) -- talk page
end
local legible = true
local contrast = require('Module:Color contrast')._ratio
local function has_text(wikitext)
wikitext = wikitext:gsub("]]", "|]]")
wikitext = wikitext:gsub("%[%[%s*[Mm][Ee][Dd][Ii][Aa]%s*:[^|]-(|.-)]]", "")
wikitext = wikitext:gsub("%[%[%s*[Ii][Mm][Aa][Gg][Ee]%s*:[^|]-(|.-)]]", "")
wikitext = wikitext:gsub("%[%[%s*[Ff][Ii][Ll][Ee]%s*:[^|]-(|.-)]]", "")
return mw.text.trim(wikitext) ~= ""
end
if contrast { data.infoColor, data.backgroundColor, error = 0 } < 4.5 then
legible = false
end
-- For bold text >= 14pt, requirement is only 3.
local idContrastThreshold = 4.5
local id2ContrastThreshold = 4.5
if (data.idFontSize or 0) >= 14 then
idContrastThreshold = 3
end
if (data.id2FontSize or 0) >= 14 then
id2ContrastThreshold = 3
end
if data.showId and contrast { data.idColor, data.idBackgroundColor, error = 0 } < idContrastThreshold then
if has_text(data.id or "") then
legible = false
end
end
if data.showId2 and contrast { data.id2Color, data.id2BackgroundColor, error = 0 } < id2ContrastThreshold then
if has_text(data.id2 or "") then
legible = false
end
end
if not legible then
root:wikitext('[[Category:Userboxes with insufficient color contrast]]')
end
return tostring(root)
end
function p.categories(args, page)
-- Gets categories from [[Module:Category handler]].
-- The page parameter makes the function act as though the module was being called from that page.
-- It is included for testing purposes.
local cats = {}
cats[#cats + 1] = args.usercategory
cats[#cats + 1] = args.usercategory2
cats[#cats + 1] = args.usercategory3
cats[#cats + 1] = args.usercategory4
cats[#cats + 1] = args.usercategory5
-- Get the title object
local title
if page then
title = mw.title.new(page)
else
title = mw.title.getCurrentTitle()
end
-- Build category handler arguments.
local chargs = {}
chargs.page = page
chargs.nocat = args.nocat
chargs.main = '[[Category:Pages with templates in the wrong namespace]]'
if args.notcatsubpages then
chargs.subpage = 'no'
end
-- User namespace.
local user = ''
for i, cat in ipairs(cats) do
user = user .. makeCat(cat)
end
chargs.user = user
-- Template namespace.
local basepage = title.baseText
local template = ''
for i, cat in ipairs(cats) do
template = template .. makeCat(cat, ' ' .. basepage)
end
chargs.template = template
return categoryHandler(chargs)
end
return p
3afddd38f65cb302185911fa9957526a85855673
Module:Userbox/doc
828
149
167
2023-10-08T10:09:05Z
Silentg
2
Created page with "{{High-use|233415}} {{Lua|Module:Category handler|Module:Arguments|Module:Color contrast}} This module does the processing for three userbox templates, {{tl|userbox}}, {{tl|userbox-2}} and {{tl|userbox-r}}. {| class="wikitable" |- ! Template ! Description ! Examples |- | {{tl|userbox}} | Makes userboxes with an id on the left-hand side, or with no id. | {{userbox|id=id}} {{clear}} {{userbox}} |- | {{tl|userbox-2}} | Makes userboxes with an id on both the left- and righ..."
wikitext
text/x-wiki
{{High-use|233415}}
{{Lua|Module:Category handler|Module:Arguments|Module:Color contrast}}
This module does the processing for three userbox templates, {{tl|userbox}}, {{tl|userbox-2}} and {{tl|userbox-r}}.
{| class="wikitable"
|-
! Template
! Description
! Examples
|-
| {{tl|userbox}}
| Makes userboxes with an id on the left-hand side, or with no id.
| {{userbox|id=id}}
{{clear}}
{{userbox}}
|-
| {{tl|userbox-2}}
| Makes userboxes with an id on both the left- and right-hand sides.
| {{userbox-2}}
|-
| {{tl|userbox-r}}
| Makes userboxes with an id on the right-hand side.
| {{userbox-r}}
|}
To use any of these templates from a wiki page, please see the individual template pages for documentation. To generate userboxes directly from Lua, read on.
== Generating userboxes from Lua ==
To generate a userbox directly from Lua, first load the module.
<syntaxhighlight lang="lua">
local userbox = require('Module:Userbox')
</syntaxhighlight>
You can then run any of the three templates with the code:
<syntaxhighlight lang="lua">
userbox.main(functionName, args)
</syntaxhighlight>
For {{tl|userbox}} use the function name "<code>_userbox</code>"; for {{tl|userbox-2}} use the function name "<code>_userbox-2</code>"; and for {{tl|userbox-r}} use the function name "<code>_userbox-r</code>". The <code>args</code> parameter is a table of arguments to pass to the different userbox functions. To see a list of valid arguments, please consult the individual template pages.
== Tracking categories ==
* {{clc|Userboxes with insufficient color contrast}}
* {{clc|Pages with templates in the wrong namespace}}
959aeab2b9a931fbb3e6f5906961bd851cc3921b
Module:Color contrast
828
150
168
2023-10-08T10:10:46Z
Silentg
2
Created page with "-- -- This module implements -- {{Color contrast ratio}} -- {{Greater color contrast ratio}} -- {{ColorToLum}} -- {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) local function sRGB (v) if (v <= 0.03928) then v = v / 12.92 else v = math.pow((v+0.055)/1.055, 2.4) end return v end local function rgbdec2lum(R, G, B) if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then return 0.2126 *..."
Scribunto
text/plain
--
-- This module implements
-- {{Color contrast ratio}}
-- {{Greater color contrast ratio}}
-- {{ColorToLum}}
-- {{RGBColorToLum}}
--
local p = {}
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local function sRGB (v)
if (v <= 0.03928) then
v = v / 12.92
else
v = math.pow((v+0.055)/1.055, 2.4)
end
return v
end
local function rgbdec2lum(R, G, B)
if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
else
return ''
end
end
local function hsl2lum(h, s, l)
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2*l - 1))*s
local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2
local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end
return rgbdec2lum(255*r, 255*g, 255*b)
else
return ''
end
end
local function color2lum(c)
if (c == nil) then
return ''
end
-- html '#' entity
c = c:gsub("#", "#")
-- whitespace
c = c:match( '^%s*(.-)[%s;]*$' )
-- unstrip nowiki strip markers
c = mw.text.unstripNoWiki(c)
-- lowercase
c = c:lower()
-- first try to look it up
local L = HTMLcolor[c]
if (L ~= nil) then
return L
end
-- convert from hsl
if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
end
-- convert from rgb
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
end
-- convert from rgb percent
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
end
-- remove leading # (if there is one) and whitespace
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$')
-- split into rgb
local cs = mw.text.split(c or '', '')
if( #cs == 6 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
return rgbdec2lum(R, G, B)
elseif ( #cs == 3 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])
return rgbdec2lum(R, G, B)
end
-- failure, return blank
return ''
end
-- This exports the function for use in other modules.
-- The colour is passed as a string.
function p._lum(color)
return color2lum(color)
end
function p._greatercontrast(args)
local bias = tonumber(args['bias'] or '0') or 0
local css = (args['css'] and args['css'] ~= '') and true or false
local v1 = color2lum(args[1] or '')
local c2 = args[2] or '#FFFFFF'
local v2 = color2lum(c2)
local c3 = args[3] or '#000000'
local v3 = color2lum(c3)
local ratio1 = -1;
local ratio2 = -1;
if (type(v1) == 'number' and type(v2) == 'number') then
ratio1 = (v2 + 0.05)/(v1 + 0.05)
ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1
end
if (type(v1) == 'number' and type(v3) == 'number') then
ratio2 = (v3 + 0.05)/(v1 + 0.05)
ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2
end
if css then
local c1 = args[1] or ''
if mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c1 = '#' .. c1
end
if mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c2 = '#' .. c2
end
if mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c3 = '#' .. c3
end
return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
end
return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or ''
end
function p._ratio(args)
local v1 = color2lum(args[1])
local v2 = color2lum(args[2])
if (type(v1) == 'number' and type(v2) == 'number') then
-- v1 should be the brighter of the two.
if v2 > v1 then
v1, v2 = v2, v1
end
return (v1 + 0.05)/(v2 + 0.05)
else
return args['error'] or '?'
end
end
function p._styleratio(args)
local style = (args[1] or ''):lower()
local bg, fg = 'white', 'black'
local lum_bg, lum_fg = 1, 0
if args[2] then
local lum = color2lum(args[2])
if lum ~= '' then bg, lum_bg = args[2], lum end
end
if args[3] then
local lum = color2lum(args[3])
if lum ~= '' then fg, lum_fg = args[3], lum end
end
local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
for k = 1,#slist do
local s = slist[k]
local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
k = k or ''
v = v or ''
if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_bg = v, lum end
elseif (k:match('^[%s]*(color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_fg = v, lum end
end
end
if lum_bg > lum_fg then
return (lum_bg + 0.05)/(lum_fg + 0.05)
else
return (lum_fg + 0.05)/(lum_bg + 0.05)
end
end
--[[
Use {{#invoke:Color contrast|somecolor}} directly or
{{#invoke:Color contrast}} from a wrapper template.
Parameters:
-- |1= — required; A color to check.
--]]
function p.lum(frame)
local color = frame.args[1] or frame:getParent().args[1]
return p._lum(color)
end
function p.ratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._ratio(args)
end
function p.styleratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._styleratio(args)
end
function p.greatercontrast(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._greatercontrast(args)
end
return p
1e399769117591366a63f62996c9a407077cc711
Module:Color contrast/doc
828
151
169
2023-10-08T10:11:51Z
Silentg
2
Created page with "<!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{module rating|protected}} {{High-use|325916}} {{Lua|Module:Color contrast/colors}} This module is used primarily by * {{tl|Color contrast ratio}} * {{tl|RGBColorToLum}} * {{tl|Color contrast conformance}} * {{tl|Ensure AAA contrast ratio}} * {{tl|Ensure AA contrast ratio}} * {{tl|Greater color contrast ratio}} It is also used for tracking within * [[Module:Navbox]] * Module:Userbo..."
wikitext
text/x-wiki
<!-- Categories go at the bottom of this page and interwikis go in Wikidata. -->
{{module rating|protected}}
{{High-use|325916}}
{{Lua|Module:Color contrast/colors}}
This module is used primarily by
* {{tl|Color contrast ratio}}
* {{tl|RGBColorToLum}}
* {{tl|Color contrast conformance}}
* {{tl|Ensure AAA contrast ratio}}
* {{tl|Ensure AA contrast ratio}}
* {{tl|Greater color contrast ratio}}
It is also used for tracking within
* [[Module:Navbox]]
* [[Module:Userbox]]
* [[Module:Episode list]]
and for documentation in
* [[Module:College color]]
The formulas used are [https://www.w3.org/WAI/GL/wiki/Relative_luminance#Definition_as_Stated_in_WCAG_2.x stated in WCAG 2.x specifications]. [[WCAG]] is the main guideline for creating accessible interfaces on the web.
== Usage ==
To use this module, you may use one of the above listed templates or invoke the module directly
* To compute relative luminescence: <br> <code><nowiki>{{ColorToLum|color}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|lum|color}}</nowiki></code>
* To compute a contrast ratio between two colors: <br> <code><nowiki>{{Color contrast ratio|color1|color2|error=?}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|ratio|color1|color2|error=?}}</nowiki></code>
* To determine which of two colors (color2a and color2b) has the greater contrast ratio with a particular color (color1): <br> <code><nowiki>{{Greater color contrast ratio|color1|color2a|color2b}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|greatercontrast|color1|color2a|color2b}}</nowiki></code>
* To compute the contrast ratio between the background and text colors specified in a css style string: <br> <code><nowiki>{{#invoke:Color contrast|styleratio|css style statement string|default background color|default text color}}</nowiki></code>
<includeonly>{{sandbox other||
[[Category:Modules handling colors]]
}}</includeonly>
c0d7bb58633fe43eca934ce34030b5b21830b2d4
Module:Color contrast/colors
828
152
170
2023-10-08T10:12:12Z
Silentg
2
Created page with "return { aliceblue = 0.92880068253475, antiquewhite = 0.84646951707754, aqua = 0.7874, aquamarine = 0.8078549208338, azure = 0.97265264954166, beige = 0.8988459998705, bisque = 0.80732327372979, black = 0, blanchedalmond = 0.85084439608156, blue = 0.0722, blueviolet = 0.12622014321946, brown = 0.098224287876511..."
Scribunto
text/plain
return {
aliceblue = 0.92880068253475,
antiquewhite = 0.84646951707754,
aqua = 0.7874,
aquamarine = 0.8078549208338,
azure = 0.97265264954166,
beige = 0.8988459998705,
bisque = 0.80732327372979,
black = 0,
blanchedalmond = 0.85084439608156,
blue = 0.0722,
blueviolet = 0.12622014321946,
brown = 0.098224287876511,
burlywood = 0.51559844533893,
cadetblue = 0.29424681085422,
chartreuse = 0.76032025902623,
chocolate = 0.23898526114557,
coral = 0.37017930872924,
cornflowerblue = 0.30318641994179,
cornsilk = 0.93562110372965,
crimson = 0.16042199953026,
cyan = 0.7874,
darkblue = 0.018640801980939,
darkcyan = 0.20329317839046,
darkgoldenrod = 0.27264703559993,
darkgray = 0.39675523072563,
darkgreen = 0.091143429047575,
darkgrey = 0.39675523072563,
darkkhaki = 0.45747326349994,
darkmagenta = 0.07353047651207,
darkolivegreen = 0.12651920884889,
darkorange = 0.40016167026524,
darkorchid = 0.13413142174857,
darkred = 0.054889674531132,
darksalmon = 0.40541471563381,
darkseagreen = 0.43789249325969,
darkslateblue = 0.065792846227988,
darkslategray = 0.067608151928044,
darkslategrey = 0.067608151928044,
darkturquoise = 0.4874606277449,
darkviolet = 0.10999048339343,
deeppink = 0.23866895828276,
deepskyblue = 0.44481603395575,
dimgray = 0.14126329114027,
dimgrey = 0.14126329114027,
dodgerblue = 0.27442536991456,
firebrick = 0.10724525535015,
floralwhite = 0.95922484825004,
forestgreen = 0.18920812076002,
fuchsia = 0.2848,
gainsboro = 0.71569350050648,
ghostwhite = 0.94311261886323,
gold = 0.69860877428159,
goldenrod = 0.41919977809569,
gray = 0.2158605001139,
green = 0.15438342968146,
greenyellow = 0.80609472611453,
grey = 0.2158605001139,
honeydew = 0.96336535554782,
hotpink = 0.34658438169715,
indianred = 0.21406134963884,
indigo = 0.03107561486337,
ivory = 0.99071270600615,
khaki = 0.77012343394121,
lavender = 0.80318750514521,
lavenderblush = 0.90172748631046,
lawngreen = 0.73905893124963,
lemonchiffon = 0.94038992245622,
lightblue = 0.63709141280807,
lightcoral = 0.35522120733135,
lightcyan = 0.94587293494829,
lightgoldenrodyellow = 0.93348351018297,
lightgray = 0.65140563741982,
lightgreen = 0.69091979956865,
lightgrey = 0.65140563741982,
lightpink = 0.58566152734898,
lightsalmon = 0.4780675225206,
lightseagreen = 0.35050145117042,
lightskyblue = 0.56195637618331,
lightslategray = 0.23830165007287,
lightslategrey = 0.23830165007287,
lightsteelblue = 0.53983888284666,
lightyellow = 0.98161818392882,
lime = 0.7152,
limegreen = 0.44571042246098,
linen = 0.88357340984379,
magenta = 0.2848,
maroon = 0.045891942324215,
mediumaquamarine = 0.49389703310801,
mediumblue = 0.044077780212328,
mediumorchid = 0.21639251153773,
mediumpurple = 0.22905858091648,
mediumseagreen = 0.34393112338131,
mediumslateblue = 0.20284629471622,
mediumspringgreen = 0.70704308194184,
mediumturquoise = 0.5133827926448,
mediumvioletred = 0.14371899849357,
midnightblue = 0.02071786635086,
mintcream = 0.97834604947588,
mistyrose = 0.82183047859185,
moccasin = 0.80083000991567,
navajowhite = 0.76519682342785,
navy = 0.015585128108224,
oldlace = 0.91900633405549,
olive = 0.20027537200568,
olivedrab = 0.22593150951929,
orange = 0.4817026703631,
orangered = 0.25516243753416,
orchid = 0.31348806761439,
palegoldenrod = 0.78792647887614,
palegreen = 0.77936759006353,
paleturquoise = 0.76436077921714,
palevioletred = 0.28754994117889,
papayawhip = 0.87797100199835,
peachpuff = 0.74905589878251,
peru = 0.30113074877936,
pink = 0.63271070702466,
plum = 0.45734221587969,
powderblue = 0.68254586500605,
purple = 0.061477070432439,
rebeccapurple = 0.07492341159447,
red = 0.2126,
rosybrown = 0.32319457649407,
royalblue = 0.16663210743188,
saddlebrown = 0.097922285020521,
salmon = 0.36977241527596,
sandybrown = 0.46628543696283,
seagreen = 0.19734199706275,
seashell = 0.92737862206922,
sienna = 0.13697631337098,
silver = 0.52711512570581,
skyblue = 0.55291668518184,
slateblue = 0.14784278062136,
slategray = 0.20896704076536,
slategrey = 0.20896704076536,
snow = 0.96533341834849,
springgreen = 0.73052306068529,
steelblue = 0.20562642207625,
tan = 0.48237604163921,
teal = 0.16996855778968,
thistle = 0.56818401093733,
tomato = 0.30638612719415,
turquoise = 0.5895536427578,
violet = 0.40315452986676,
wheat = 0.74909702820482,
white = 1,
whitesmoke = 0.91309865179342,
yellow = 0.9278,
yellowgreen = 0.50762957208707,
}
6ae47fdb24de4eed5ec26d203faf5341a388987b
Module:Color contrast/colors/doc
828
153
171
2023-10-08T10:12:32Z
Silentg
2
Created page with "{{High-use|327086}} {{Module rating |protected}} This module contains the [[relative luminance]] of [[HTML colors]]. It is used in [[Module:Color contrast]]."
wikitext
text/x-wiki
{{High-use|327086}}
{{Module rating |protected}}
This module contains the [[relative luminance]] of [[HTML colors]]. It is used in [[Module:Color contrast]].
4211178131e2a5d3ea62f08d00c83335be831544
Main Page
0
1
172
21
2023-10-08T10:45:41Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;max-width:74%">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
<p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:0px 0px 0px 2px;width:25%">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p>shows transcluded news</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:2px 0px 0px 0px;max-width:50%">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
2630727ea6eb0f3e27679744f75033928a552e4d
180
172
2023-10-09T13:47:47Z
Silentg
2
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<!-- Begin left column -->
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
<p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;">
<div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div>
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
</div>
<!-- Begin right column -->
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 0px 2px;width:100%;">
<div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div>
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
b71b62726f8e62f1d57e620c7cbdb4276973b66e
181
180
2023-10-10T04:01:01Z
2.50.172.28
0
-SIlentg, from school >v<
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<!-- Begin left column -->
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
<p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;">
<div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">Quick Start</div>
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
</div>
<!-- Begin right column -->
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">Contribute</div>
<p style="padding-left:3px;">Links to stuff to know when editing articles</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">[[News]]</div>
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
ebdb2199b06776b2db4fc00feb842c985246516f
188
181
2023-10-12T15:20:54Z
TBF
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<!-- Left column -->
<div style="float:left;width:75%">
<!-- Main box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 2px 0px 0px;width:49%">
<div style="font-size:20px;text-align:center">Items</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:49%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;position:relative;width:49%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
</div>
<!-- Right column -->
<div style="float:right;width:25%">
<!-- Contribute box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<!-- News box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
3e4bb48355ebd3241d0469da3ab8d8b53082eb03
189
188
2023-10-12T16:09:55Z
wikitext
text/x-wiki
<p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p>
<!-- Left column -->
<div style="float:left;width:75%">
<!-- Main box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;">
<p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 2px 0px 0px;width:49%">
<div style="font-size:20px;text-align:center">Items</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:49%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;position:relative;width:49%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%">
<div style="font-size:20px;text-align:center">Quick Start</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p>
<ul>
<li>[[Mechanics]]</li>
<li>[[Echoes]]</li>
<li>[[Characters]]</li>
<li>[[Witnessess]]</li>
<li>[[Locations]]</li>
<li>[[Items]]</li>
</ul>
</div>
</div>
<!-- Right column -->
<div style="float:right;width:25%">
<!-- Contribute box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<!-- News box -->
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
019cf9e8ce5a750995a4fc5326b340453dab74c3
191
189
2023-10-14T16:23:49Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1">
<div style="font-size:20px;text-align:center">Lore</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;grid-row:1;">
<div style="font-size:20px;text-align:center">Locations</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">The Abyss is a beeg place.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
5d0800cae4b8e2fcd114a891ad0abd1a829a425f
192
191
2023-10-14T17:27:38Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
7ea1f247e1a2a3fd7271c2dddf194020396967ff
195
192
2023-10-15T04:30:39Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;max-width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
2c015f96e414417276522cc2b9e7ea55402222c0
196
195
2023-10-15T04:31:24Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;width:100%">
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
ded7ad6d7aa74225a6fd2fdb647ac9f4dda1095a
197
196
2023-10-15T04:38:27Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;grid-template-columns:50% 50%">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
bc4d6455cc7c99fdcee316584ed82c0f55d279f0
198
197
2023-10-15T04:40:20Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="display:grid;clear:left;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
878e3eb73c7ea37a8daf5f90039c423f62280408
199
198
2023-10-15T04:43:36Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
38c77a4db7ad2fb9bf6d217fd2e83800647ab9d8
200
199
2023-10-15T04:44:12Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
3dce40e380140d73777485aa14f0b51549c12c67
File:Masks.png
6
154
173
2023-10-08T15:56:53Z
Reduckilous
4
wikitext
text/x-wiki
The template image for the Mask section(Temporary).
cdeaf4962a7edf47a1b09d88bf825ed650845dbe
File:Wings.png
6
155
174
2023-10-08T16:01:34Z
Reduckilous
4
wikitext
text/x-wiki
Template image for the Wings page(Temporary).
4ce2af0a8829ac2f3704461d3c5548c09062bfe3
File:Dyes.png
6
156
175
2023-10-08T16:06:22Z
Reduckilous
4
wikitext
text/x-wiki
Template image for the Dye page(Temporary).
10f51ed80701810e6548351fa9414445cd4c0024
Items
0
157
176
2023-10-08T16:09:09Z
Reduckilous
4
Created page with "There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. [[File:Masks.png|frame|[[Masks]]]] [[File:Wings.png|frame|[[Wings]]]] [[File:Dyes.png|frame|[[Dyes]]]]"
wikitext
text/x-wiki
There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.
[[File:Masks.png|frame|[[Masks]]]]
[[File:Wings.png|frame|[[Wings]]]]
[[File:Dyes.png|frame|[[Dyes]]]]
ae767139d13c84ceea2ae2564d58e92fd39100f8
177
176
2023-10-08T16:12:32Z
Reduckilous
4
wikitext
text/x-wiki
There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.
[[File:Masks.png|frame|100px|[[Masks]]]]
[[File:Wings.png|frame|100px|[[Wings]]]]
[[File:Dyes.png|frame|100px|[[Dyes]]]]
8332bd099a8179231c8f27a612af83e2c1cc361c
178
177
2023-10-08T17:03:58Z
Reduckilous
4
wikitext
text/x-wiki
There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.
[[File:Masks.png|150px|left|thumb|[[Masks]]]]
[[File:Wings.png|150px|left|thumb|[[Wings]]]]
[[File:Dyes.png|150px|left|thumb|[[Dyes]]]]
1b2dcd6918d7fc4e48bbc1f9f5b322b0078462aa
179
178
2023-10-09T02:27:34Z
Reduckilous
4
wikitext
text/x-wiki
There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.
<div style="display: flex">
[[File:Masks.png|150px|left|thumb|[[Masks]]]]
[[File:Wings.png|150px|left|thumb|[[Wings]]]]
[[File:Dyes.png|150px|left|thumb|[[Dyes]]]]
</div>
757658693eafaf0090ef1d4d04e82e5b81bd1b84
File:Locations.png
6
158
182
2023-10-10T11:31:08Z
Reduckilous
4
Icon for the Locations section(Temporary).
wikitext
text/x-wiki
== Summary ==
Icon for the Locations section(Temporary).
ea013cb7487ea0fd71d9487a1f3d06c19ea02720
File:Echoes.png
6
159
183
2023-10-10T11:33:34Z
Reduckilous
4
Icon for the echo section(temporary)
wikitext
text/x-wiki
== Summary ==
Icon for the echo section(temporary)
f4aa3b2f9f87f97f6378131b23b7d3bfe7cdda02
File:NPC.png
6
160
184
2023-10-10T11:46:26Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Mechanics.png
6
161
185
2023-10-10T11:47:26Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Item.png
6
162
186
2023-10-10T11:48:41Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Witness.png
6
163
187
2023-10-10T12:57:36Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
MediaWiki:Sidebar
8
164
190
2023-10-13T16:55:51Z
Silentg
2
Created page with " * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage * SEARCH * TOOLBOX * LANGUAGES"
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
* SEARCH
* TOOLBOX
* LANGUAGES
48f48a2887a6e5e7a6b5c92e90467ac3661e0858
File:Placeholder.png
6
165
193
2023-10-14T18:01:09Z
Reduckilous
4
Replace the default placefolder image
wikitext
text/x-wiki
== Summary ==
Replace the default placefolder image
482d11c9bbd775ade0d46cfbb3515681036580b8
File:No-image.png
6
166
194
2023-10-14T18:02:59Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Main Page
0
1
201
200
2023-10-15T04:45:19Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
d1bf22b29ac6dff056059a9f6f5980bacc5d53fa
204
201
2023-10-15T10:47:39Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
<div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto">
<div style="padding-left:3px;">[[Editing guidelines]]</div>
<div style="padding-left:3px;">[[Wanted pages]]</div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
07a1e7aef385c5819b941620429aa17e8c4eed14
205
204
2023-10-16T14:31:32Z
Silentg
2
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;">
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
<div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto">
<div style="padding-left:3px;">[[Editing guidelines]]</div>
<div style="padding-left:3px;">[[Wanted pages]]</div>
<div style="padding-left:3px;">[[Wanted templates]]</div>
</div>
</div>
<div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
669a5489e97ea1333d316edb4447dfd1079cdb52
209
205
2023-10-16T14:50:03Z
Silentg
2
Slight decluttering
wikitext
text/x-wiki
<p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p>
<div style="float:left;width:75%">
<div class="mp-box" id="mp-LeadBox">
<p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p>
</div>
<div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;">
<div class="mp-box">
<div style="font-size:20px;text-align:center">Gameplay</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div>
<div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div>
<div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div>
</div>
</div>
<div class="mp-box">
<div style="font-size:20px;text-align:center">Cosmetics</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p>
<div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div>
<div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div>
<div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div>
</div>
</div>
<div class="mp-box" style="grid-column:1 / span 2;">
<div style="font-size:20px;text-align:center">World</div>
<hr style="margin:0px 5px">
<p style="padding-left:3px;"></p>
<div style="align-items:center;display:flex;justify-content:center;margin:5px;">
<div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div>
<div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div>
</div>
</div>
</div>
</div>
<div style="float:right;width:25%">
<div class="mp-box" style="float:left;margin:0px 0px 2px 2px;width:100%;">
<div style="font-size:20px;text-align:center">Contribute</div>
<hr style="margin:0px 5px">
<p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p>
<div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto">
<div style="padding-left:3px;">[[Editing guidelines]]</div>
<div style="padding-left:3px;">[[Wanted pages]]</div>
<div style="padding-left:3px;">[[Wanted templates]]</div>
</div>
</div>
<div class="mp-box" style="float:left;margin:2px 0px 0px 2px;width:100%;">
<div style="font-size:20px;text-align:center">News</div>
<hr style="margin:0px 5px">
<p style="padding-left:10px;"><b>Game news</b></p>
<p style="padding-left:10px;"><b>nextReality news</b></p>
<p style="padding-left:10px;"><b>Wiki news</b></p>
</div>
</div>
4e973b8261fdda67bda41fef68562ee148de2aea
Abyssal Wiki:About
4
167
202
2023-10-15T05:16:54Z
Silentg
2
Created page with "Abyssal Wiki is dedicated to being the most reliable source of information for the Roblox game Abyssal developed by nextReality Games."
wikitext
text/x-wiki
Abyssal Wiki is dedicated to being the most reliable source of information for the Roblox game Abyssal developed by nextReality Games.
2293f34836ac223c56490f7413ea6a1de8d9db89
MediaWiki:Common.css
8
140
206
158
2023-10-16T14:39:14Z
Silentg
2
css
text/css
/* CSS placed here will be applied to all skins */
/* vvv Move to TemplateStyles when WP does vvv */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
/* Main Page styles */
.mp-box {
border-radius:5px;
border-style:solid;
border-width:1px;
}
c3be168fdff55fcf7fd4fc8c0fb8ea7d8397b8f1
207
206
2023-10-16T14:40:07Z
Silentg
2
css
text/css
/* CSS placed here will be applied to all skins */
/* vvv Move to TemplateStyles when WP does vvv */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
/* Main Page styles */
.mp-box {
border-radius: 5px;
border-style: solid;
border-width: 1px;
}
e2cbc897dbbb898d8c7c950f3de6ffafc3206f76
208
207
2023-10-16T14:45:38Z
Silentg
2
css
text/css
/* CSS placed here will be applied to all skins */
/* vvv Move to TemplateStyles when WP does vvv */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
/* Main Page styles */
.mp-box {
border-radius: 5px;
border-style: solid;
border-width: 1px;
}
#mp-LeadBox {
float: left;
margin-bottom: 2px;
}
13cd531e739db25f34450d5cd83742bfad04f204
210
208
2023-10-16T14:52:51Z
Silentg
2
Protected "[[MediaWiki:Common.css]]": Could mess up a lot of things if anyone could edit this ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
css
text/css
/* CSS placed here will be applied to all skins */
/* vvv Move to TemplateStyles when WP does vvv */
/* Infobox template style */
.infobox {
border: 1px solid #a2a9b1;
border-spacing: 3px;
background-color: #f8f9fa;
color: black;
/* @noflip */
margin: 0.5em 0 0.5em 1em;
padding: 0.2em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
font-size: 88%;
line-height: 1.5em;
width: 22em;
}
.infobox-header,
.infobox-label,
.infobox-above,
.infobox-full-data,
.infobox-data,
.infobox-below,
.infobox-subheader,
.infobox-image,
.infobox-navbar,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
vertical-align: top;
}
.infobox-label,
.infobox-data,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox th,
.infobox td {
/* @noflip */
text-align: left;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-above,
.infobox .infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
font-size: 125%;
font-weight: bold;
text-align: center;
}
.infobox-title,
/* Remove element selector when every .infobox thing is using the standard module/templates */
.infobox caption {
padding: 0.2em;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-header,
.infobox .infobox-subheader,
.infobox .infobox-image,
.infobox .infobox-full-data,
.infobox .infobox-below {
text-align: center;
}
/* Remove .infobox when element selectors above are removed */
.infobox .infobox-navbar {
/* @noflip */
text-align: right;
}
/* Main Page styles */
.mp-box {
border-radius: 5px;
border-style: solid;
border-width: 1px;
}
#mp-LeadBox {
float: left;
margin-bottom: 2px;
}
13cd531e739db25f34450d5cd83742bfad04f204
Masks
0
169
211
2023-10-25T12:20:45Z
Reduckilous
4
Created page with "<h1> Masks </h1> <p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico mask.(Add more to this part)</p> <h2> Seasonal masks </h2> <table class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; color: #FFFFF5;"> <tr> <th style="background-color: #3472AD; Width:13% ">Name</th> <th styl..."
wikitext
text/x-wiki
<h1> Masks </h1>
<p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico mask.(Add more to this part)</p>
<h2> Seasonal masks </h2>
<table class="wikitable sortable"
style="width:100%;
border: 1px solid;
border-color: #E0E28D;
border-collapse: collapse;
background-color: #0B2347;
color: #FFFFF5;">
<tr>
<th style="background-color: #3472AD; Width:13% ">Name</th>
<th style="background-color: #3472AD; Width:12% ">Appearence</th>
<th style="background-color: #3472AD ">Location</th>
<th style="background-color: #3472AD; Width:10% ">Height</th>
<th style="background-color: #3472AD; Width:15% ">Difficulty</th>
</tr>
<tr>
<td>[[Jack O’ Lantern Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]</td>
<td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Owl Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Owl Crest Mask]]]]</td>
<td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Moonlight Pico Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Moonlight Pico Mask]]]]</td>
<td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Ghost Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Ghost Crest Mask]]]]</td>
<td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Creepy Smile Crest Mask]]</td> <td>[[File:Placeholder.png|100px|[[link=Creepy Smile Crest Mask]]]]</td>
<td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Evil Eye Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Evil Eye Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr>
<tr>
<td>[[Skull Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Skull Crest Mask]]]]</td> <td>t</td>
<td>t</td> <td>t</td> </tr>
</table>
8b371b0f7d6ab9598b8e541a332d25e236b49b95
219
211
2023-10-25T17:45:34Z
Reduckilous
4
wikitext
text/x-wiki
<h1> Masks </h1>
<p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico
mask.(Add more to this part)</p>
<h2> Seasonal masks </h2>
<table class="wikitable sortable"
style="width:100%;
border: 1px solid;
border-color: #E0E28D;
border-collapse: collapse;
background-color: #0B2347;
text-align: center;
color: #FFFFF5;">
<tr>
<th style="background-color: #3472AD; Width:13% ">Name</th>
<th style="background-color: #3472AD; Width:12% ">Appearence</th>
<th style="background-color: #3472AD ">Location</th>
<th style="background-color: #3472AD; Width:10% ">Height</th>
<th style="background-color: #3472AD; Width:15% ">Difficulty</th>
</tr>
<tr>
<td>[[Jack O’ Lantern Crest Mask]]</td> <td>[[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]</td>
<td>
<ul> <li>Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].</li> <li>Can be obtained the quickest by falling down the bridge near [[Witness Store]].</li> </ul>
</td> <td>19</td> <td>Easy</td> </tr>
<tr>
<td>[[Owl Crest Mask]]</td> <td>[[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]</td>
<td> Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
</td> <td>63</td> <td>Easy</td> </tr>
<tr>
<td>[[Moonlight Pico Mask]]</td> <td>[[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]</td>
<td>
<ul> <li>Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.</li> <li>Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.</li></ul>
</td> <td>312</td> <td>Medium</td> </tr>
<tr>
<td>[[Ghost Crest Mask]]</td> <td>[[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]</td>
<td>Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.</td> <td>783</td> <td>Easy</td> </tr>
<tr>
<td>[[Creepy Smile Crest Mask]]</td> <td>[[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]</td>
<td> <ul> <li>Located directly above [[Bridge of Connection]].</li><li>Can be reached from falling near [[Refinery Overlook]].</li></ul> </td> <td>805</td> <td>Medium</td> </tr>
<tr>
<td>[[Evil Eye Crest Mask]]</td> <td>[[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]</td> <td>Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].</td> <td>1040</td> <td>Easy</td> </tr>
<tr>
<td>[[Skull Crest Mask]]</td> <td>[[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]</td> <td> <ul> <li>Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].</li> <li>Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.</li></ul> </td>
<td>1175</td> <td>Easy</td> </tr>
</table>
77fe38fb9ed2b3bc02d7b216a4dce7d2e14c5ce2
220
219
2023-10-27T02:31:54Z
Reduckilous
4
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks
|-
!style="background-color:#3472AD; Width:13%"| Name
!style="background-color:#3472AD; Width:12%"| Appearance
!style="background-color:#3472AD"|Location
!style="background-color:#3472AD; Width:10%"| Height
!style="background-color:#3472AD; Width:15%"| Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
ae182fc274f9bdd1c3c5a6d5ac5b1708c7ecd70c
221
220
2023-10-27T02:49:35Z
Reduckilous
4
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
84c8aecda1596e55b9851167b51e71c7e61c4087
File:Skull Crest Mask.png
6
170
212
2023-10-25T17:37:10Z
Reduckilous
4
skull mask
wikitext
text/x-wiki
== Summary ==
skull mask
83f55f9eb1655f82633575c3d1cfd766b4777a0c
227
212
2023-10-27T12:57:34Z
Reduckilous
4
Reduckilous moved page [[File:Skull1.png]] to [[File:Skull Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
skull mask
83f55f9eb1655f82633575c3d1cfd766b4777a0c
File:Jack O’ Lantern Crest Mask.png
6
171
213
2023-10-25T17:40:44Z
Reduckilous
4
jacko mask
wikitext
text/x-wiki
== Summary ==
jacko mask
d4deee995f959afe4939be8acadacdbca2e42751
243
213
2023-10-27T13:14:45Z
Reduckilous
4
Reduckilous moved page [[File:Jacko1.png]] to [[File:Jack O’ Lantern Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
jacko mask
d4deee995f959afe4939be8acadacdbca2e42751
File:Owl Crest Mask.png
6
172
214
2023-10-25T17:41:44Z
Reduckilous
4
owl mask
wikitext
text/x-wiki
== Summary ==
owl mask
d17a96ecea615ec65580ce45936502c8dd15ceb5
241
214
2023-10-27T13:13:16Z
Reduckilous
4
Reduckilous moved page [[File:Owl1.png]] to [[File:Owl Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
owl mask
d17a96ecea615ec65580ce45936502c8dd15ceb5
File:Moonlight Pico Mask.png
6
173
215
2023-10-25T17:42:30Z
Reduckilous
4
Pico mask halloween
wikitext
text/x-wiki
== Summary ==
Pico mask halloween
9f293091042fcef98544c12cb68fe7c0a25f2fd0
239
215
2023-10-27T13:12:20Z
Reduckilous
4
Reduckilous moved page [[File:Moonlightpico1.png]] to [[File:Moonlight Pico Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
Pico mask halloween
9f293091042fcef98544c12cb68fe7c0a25f2fd0
File:Creepy Smile Crest Mask.png
6
174
216
2023-10-25T17:43:35Z
Reduckilous
4
Creepysmile mask
wikitext
text/x-wiki
== Summary ==
Creepysmile mask
e8f979ff8290fcc0354baa3ada8be49fe15ca353
237
216
2023-10-27T13:11:32Z
Reduckilous
4
Reduckilous moved page [[File:Creepysmile1.png]] to [[File:Creepy Smile Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
Creepysmile mask
e8f979ff8290fcc0354baa3ada8be49fe15ca353
File:Ghost Crest Mask.png
6
175
217
2023-10-25T17:44:23Z
Reduckilous
4
pacman ghost mask
wikitext
text/x-wiki
== Summary ==
pacman ghost mask
14f680cf06bdc1b2b02c01795887d2adfda4877e
235
217
2023-10-27T13:10:18Z
Reduckilous
4
Reduckilous moved page [[File:Ghost1.png]] to [[File:Ghost Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
pacman ghost mask
14f680cf06bdc1b2b02c01795887d2adfda4877e
File:Evil Eye Crest Mask.png
6
176
218
2023-10-25T17:44:58Z
Reduckilous
4
evileye(according to lux) mask
wikitext
text/x-wiki
== Summary ==
evileye(according to lux) mask
b93ceb3d0f4ad404aa32ff8479d4d5106daaca1c
233
218
2023-10-27T13:02:45Z
Reduckilous
4
Reduckilous moved page [[File:EvilEye1.png]] to [[File:Evil Eye Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
evileye(according to lux) mask
b93ceb3d0f4ad404aa32ff8479d4d5106daaca1c
File:Jack O’ Lantern Crest Mask Location.png
6
177
222
2023-10-27T03:11:51Z
Reduckilous
4
Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask.
wikitext
text/x-wiki
== Summary ==
Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask.
b3151878e2d443e3e3d9672c5b406620c96ab425
231
222
2023-10-27T12:59:12Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Surroundings.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask.
b3151878e2d443e3e3d9672c5b406620c96ab425
245
231
2023-10-27T13:19:18Z
Reduckilous
4
Reduckilous moved page [[File:Jack O’ Lantern Crest Mask Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Location.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask.
b3151878e2d443e3e3d9672c5b406620c96ab425
File:Jack O’ Lantern Crest Mask Icon.png
6
178
223
2023-10-27T03:25:06Z
Reduckilous
4
The Jacko Lantern crest Mask's ingame icon
wikitext
text/x-wiki
== Summary ==
The Jacko Lantern crest Mask's ingame icon
f3092d590853dc5fe3d33d249de1bde75b85b965
225
223
2023-10-27T12:54:46Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Icon.png]] to [[File:Jack O’ Lantern Crest Mask Icon.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
The Jacko Lantern crest Mask's ingame icon
f3092d590853dc5fe3d33d249de1bde75b85b965
File:Jack O’ Lantern Crest Mask Showcase.png
6
179
224
2023-10-27T03:27:04Z
Reduckilous
4
Showcasing the Jacko Lantern crest mask in the orange dye.
wikitext
text/x-wiki
== Summary ==
Showcasing the Jacko Lantern crest mask in the orange dye.
f40f182f3f16762dd6653ea835e7f89ea9fde8f6
229
224
2023-10-27T12:58:33Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Showcase.png]] to [[File:Jack O’ Lantern Crest Mask Showcase.png]]: Misspelled title
wikitext
text/x-wiki
== Summary ==
Showcasing the Jacko Lantern crest mask in the orange dye.
f40f182f3f16762dd6653ea835e7f89ea9fde8f6
File:Jacko Icon.png
6
180
226
2023-10-27T12:54:46Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Icon.png]] to [[File:Jack O’ Lantern Crest Mask Icon.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Jack O’ Lantern Crest Mask Icon.png]]
b55d55c0babd218cb44eca8dbabf5fee5fffffcf
File:Skull1.png
6
181
228
2023-10-27T12:57:35Z
Reduckilous
4
Reduckilous moved page [[File:Skull1.png]] to [[File:Skull Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Skull Crest Mask.png]]
621f6246b6470a9e4656b258c841183ded883be1
File:Jacko Showcase.png
6
182
230
2023-10-27T12:58:34Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Showcase.png]] to [[File:Jack O’ Lantern Crest Mask Showcase.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Jack O’ Lantern Crest Mask Showcase.png]]
dc8a5379e268c4486e950bc8e01558d30f9da72c
File:Jacko Surroundings.png
6
183
232
2023-10-27T12:59:12Z
Reduckilous
4
Reduckilous moved page [[File:Jacko Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Surroundings.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Jack O’ Lantern Crest Mask Surroundings.png]]
556a537bfb30928a58997a558ecbd96bbeea2045
File:EvilEye1.png
6
184
234
2023-10-27T13:02:45Z
Reduckilous
4
Reduckilous moved page [[File:EvilEye1.png]] to [[File:Evil Eye Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Evil Eye Crest Mask.png]]
eae420c0aed6c38b2a132b972afd2b744d370191
File:Ghost1.png
6
185
236
2023-10-27T13:10:18Z
Reduckilous
4
Reduckilous moved page [[File:Ghost1.png]] to [[File:Ghost Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Ghost Crest Mask.png]]
e222bec269e7b9527d2cc2a89d6d037498d68634
File:Creepysmile1.png
6
186
238
2023-10-27T13:11:32Z
Reduckilous
4
Reduckilous moved page [[File:Creepysmile1.png]] to [[File:Creepy Smile Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Creepy Smile Crest Mask.png]]
282e6c7a3f590dc92c1d4bfe4ca9c0c4ba80f3f5
File:Moonlightpico1.png
6
187
240
2023-10-27T13:12:20Z
Reduckilous
4
Reduckilous moved page [[File:Moonlightpico1.png]] to [[File:Moonlight Pico Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Moonlight Pico Mask.png]]
53878c02c849cce4736bf6a48f9e90eea3b7ceb4
File:Owl1.png
6
188
242
2023-10-27T13:13:16Z
Reduckilous
4
Reduckilous moved page [[File:Owl1.png]] to [[File:Owl Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Owl Crest Mask.png]]
8627f72cf34b1d4b4cf76c42ed8a38574f7fbf13
File:Jacko1.png
6
189
244
2023-10-27T13:14:45Z
Reduckilous
4
Reduckilous moved page [[File:Jacko1.png]] to [[File:Jack O’ Lantern Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Jack O’ Lantern Crest Mask.png]]
85b1362aa59d1187a21631cacc61a48f3ad8ad2e
File:Jack O’ Lantern Crest Mask Surroundings.png
6
190
246
2023-10-27T13:19:18Z
Reduckilous
4
Reduckilous moved page [[File:Jack O’ Lantern Crest Mask Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Location.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Jack O’ Lantern Crest Mask Location.png]]
77707e1cf600715b25ff0a3ff838d642d3f31014
Jack O’ Lantern Crest Mask
0
191
247
2023-10-27T17:40:13Z
Reduckilous
4
Created page with "{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Jack O’ Lantern Crest Mask | name = Jack O’ Lantern Crest Mask | image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]] | label1 = In-Game Description | data1 = A mask bearing a festive face that fills you with a fondness for sweets. }} <h2>'''Appearance'''</h2> The Appearance of the mask is inverted compared to..."
wikitext
text/x-wiki
{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = Jack O’ Lantern Crest Mask
| name = Jack O’ Lantern Crest Mask
| image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]]
| label1 = In-Game Description
| data1 = A mask bearing a festive face that fills you with a fondness for sweets.
}}
<h2>'''Appearance'''</h2>
The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Jack O’ Lantern Crest Mask resemblance a normal Jack O’ Lantern, having a jagged mouth, a triangle shaped nose but have a circle shaped eye, unlike traditional Halloweens pumpkin face whereas the eyes are triangles.
<h2>'''Location'''</h2>
*It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]].
*To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it.
*You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate.
*You can fall down from the bridge before [[Witness Store]] to directly land on the item.
<h2>'''Showcase'''</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Jack O’ Lantern Crest Mask.png| The actual appearance of the mask
Jack O’ Lantern Crest Mask Location.png| The surrounding of the location of the mask
Jack O’ Lantern Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask
</gallery>
<h2>'''Trivia'''</h2>
There is, in fact, no lore to this mask. This have been confirmed, despite having such a description.
17bf3a9936491b1c84645949797e091ce5ea487d
248
247
2023-10-28T14:14:19Z
Reduckilous
4
wikitext
text/x-wiki
{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = Jack O’ Lantern Crest Mask
| name = Jack O’ Lantern Crest Mask
| image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]]
| label1 = In-Game Description
| data1 = A mask bearing a festive face that fills you with a fondness for sweets.
| label2 = Location
| data2 = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]]
| label3 = Price
| data3 = 400 AE
}}
The Jack O' Lantern Crest Mask is one of the 7 Halloween mask released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players.
<h2>Appearance</h2>
The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Jack O’ Lantern Crest Mask resemblance a normal Jack O’ Lantern, having a jagged mouth, a triangle shaped nose but have a circle shaped eye, unlike traditional Halloweens pumpkin face whereas the eyes are triangles.
<h2>Location</h2>
*It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]].
*To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it.
*You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate.
*You can fall down from the bridge before [[Witness Store]] to directly land on the item.
<h2>Showcase</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Jack O’ Lantern Crest Mask.png| The actual appearance of the mask
Jack O’ Lantern Crest Mask Location.png| The surrounding of the location of the mask
Jack O’ Lantern Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask
</gallery>
<h2>Trivia</h2>
There is, in fact, no lore to this mask. This have been confirmed, despite having such a description.
2299cafd4442fd446ba8031307ac7c1d2af7493b
Template:Mask
10
192
249
2023-10-28T15:31:12Z
Silentg
2
Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ## Appearance {{{appearance|}}} ## Location {{{loca..."
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
## Appearance
{{{appearance|}}}
## Location
{{{location|}}}
{{#if:{{{gallery|}}}|## Gallery
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|## Trivia
{{{trivia|}}}|}}</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
d20d8a7843fc9d0c34a53ac56b5bc91177b5d52b
250
249
2023-10-28T15:34:29Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
## Appearance
{{{appearance|}}}
## Location
{{{location|}}}
{{#if:{{{gallery|}}}|## Gallery
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|## Trivia
{{{trivia|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
fda158be65f142d7d65bf6b2f7ee49b3d734ef4e
File:Owl Crest Mask Icon.png
6
193
251
2023-10-28T15:37:59Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Template:Mask
10
192
252
250
2023-10-28T15:38:15Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
## Appearance
{{{appearance|}}}
## Location
{{{location|}}}
{{#if:{{{gallery|}}}|## Gallery
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|## Trivia
{{{trivia|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
8d2e0424347c9ee65c0dbc7045c2685e1b17cd96
255
252
2023-10-28T15:39:49Z
Silentg
2
It's been a while
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|==Gallery==
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|==Trivia==
{{{trivia|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
cb00a6287e78764c5b508835ac1dbcde8f7cc632
257
255
2023-10-28T15:47:15Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|==Gallery==
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|
==Trivia==
{{{trivia|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
2defb750871e746a8dd94009c6f3f6c7f0498c30
258
257
2023-10-28T15:48:38Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|==Gallery==
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>
|}}{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
45a022bf8dd250f3cdf8e08de1fad38caefd4ccd
259
258
2023-10-28T15:53:39Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
{{{refs|}}}|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
a91869bb5bd542abb0cd90afc0492263a06e362b
260
259
2023-10-28T15:54:18Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
{{{gallery|}}}
</gallery>|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
ae005226e3afe0fb0fa8041f92fab444b8e6dc20
261
260
2023-10-28T15:55:18Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">{{{gallery|}}}</gallery>|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
faa650d7e9aac9fdb4fb08712117665b6c3d16f4
262
261
2023-10-28T16:01:08Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Location==
{{{location|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
e23f21e5e0b7e06a3dd1dc96190f0522a8896176
267
262
2023-10-28T16:25:01Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
==Appearance==
{{{appearance|}}}
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
ba52c897a97f80ce6028726a7aab1105cf2e26dc
270
267
2023-10-28T16:37:29Z
Silentg
2
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Appearance==
{{{appearance|}}}
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page Templates]]
</noinclude>
912498b1a29a9ddb5ab8f307811a476d9402cd4a
File:Owl Crest Mask Showcase.png
6
194
253
2023-10-28T15:38:38Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Owl Crest Mask Location.png
6
195
254
2023-10-28T15:39:11Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Owl Crest Mask
0
196
256
2023-10-28T15:43:42Z
Reduckilous
4
Owl Crest mask page(No infobox yet)
wikitext
text/x-wiki
The Owl Crest Mask is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask of all as the "beak" of the mask can be misinterpret as a happy mouth.
<h2>Appearance</h2>
The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils, and is actually the only current mask with both eyes and their pupils. There's also a "beak" which is a simple triangle shape, but it can be seen as a "happy mouth" as well.
<h2>Location</h2>
*It lies on a bridge directly below [[The First Gate]] and can be easily spotted.
*You can get there by simply dropping down from the East side of the bridge in [[The First Gate]].
<h2>Showcase</h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Owl Crest Mask.png| The actual appearance of the mask
Owl Crest Mask Location.png| The surrounding of the location of the mask
Owl Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask
</gallery>
<h2>Trivia</h2>
Despite having a description suggesting about a new "creature", there are no lore as to this.
0232c1fb941bf30bce1c339de20e7d805364633b
272
256
2023-10-28T17:17:28Z
Reduckilous
4
wikitext
text/x-wiki
{{Mask
| name = Owl Crest Mask
| description = A mask with the face of a long-forgotten creature from the surface.
| location = [[The First Gate]]
| price = 400
| lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth.
| appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape.
| obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted.
*You can get there by simply dropping down from the East side of the bridge in [[The First Gate]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Owl Crest Mask Icon.png|The actual appearance of the mask
Owl Crest Mask Location.png|The surrounding of the location of the mask
Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
b82e56dca371a4cf82e9b97514836ccdfa1b77bb
273
272
2023-10-28T17:24:34Z
Reduckilous
4
Fixing some typos
wikitext
text/x-wiki
{{Mask
| name = Owl Crest Mask
| description = A mask with the face of a long-forgotten creature from the surface.
| location = [[The First Gate]]
| price = 400
| lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth.
| appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape.
| obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted.
*You can get there by simply dropping down from the East side of the bridge in [[The First Gate]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Owl Crest Mask Icon.png|The In-game icon of the mask
Owl Crest Mask Location.png|The surrounding of the location of the mask
Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
480fc056df5fed16673632baa55dc4ebac81b421
File:Moonlight Pico Mask Icon.png
6
197
263
2023-10-28T16:11:19Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Moonlight Pico Mask Showcase.png
6
198
264
2023-10-28T16:11:54Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Moonlight Pico Mask Location.png
6
199
265
2023-10-28T16:12:51Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Template:Mask/doc
10
200
266
2023-10-28T16:24:41Z
Silentg
2
Created page with "This template is used as a blueprint to create articles for [[Masks|masks]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Mask | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the mask. ; description : The in-game description of the mask. ; loc..."
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Masks|masks]].
== Usage ==
See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Mask
| name =
| description =
| location =
| price =
| lead =
| appearance =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; name
: The name of the mask.
; description
: The in-game description of the mask.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the mask.
; appearance
: Describe the mask's appearance as best as possible.
; obtain
: A bulleted list containing various methods to obtain the mask. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the mask. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the mask. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
20587053ba166338b8ca50368c5a47a9383e5a63
User:Silentg/sandbox
2
80
268
157
2023-10-28T16:33:58Z
Silentg
2
Replaced content with ":3"
wikitext
text/x-wiki
:3
a7c672648242f022986bc38a04b07cd846be75b2
Jack O’ Lantern Crest Mask
0
191
269
248
2023-10-28T16:34:33Z
Silentg
2
Update, proofreading
wikitext
text/x-wiki
{{Mask
| name = Jack O’ Lantern Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for sweets.
| location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]]
| price = 400
| lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes.
| obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]].
*To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it.
*You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate.
*You can fall down from the bridge before [[Witness Store]] to directly land on the item.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Jack O’ Lantern Crest Mask.png|The actual appearance of the mask
Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask
Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
e5cec9bdfc21117d0083694b628b8236a2981c80
271
269
2023-10-28T17:16:17Z
Reduckilous
4
Switches out the Mask png and the icon png in the gallery
wikitext
text/x-wiki
{{Mask
| name = Jack O’ Lantern Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for sweets.
| location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]]
| price = 400
| lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes.
| obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]].
*To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it.
*You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate.
*You can fall down from the bridge before [[Witness Store]] to directly land on the item.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Jack O’ Lantern Crest Mask Icon.png|The In-game icon of the mask
Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask
Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
09af2ef8d10d3295cc78960b3e9d27b208b15f2f
Moonlight Pico Mask
0
201
274
2023-10-28T18:42:08Z
Reduckilous
4
Creation of the moonlight pico mask page
wikitext
text/x-wiki
{{Mask
| name = Moonlight Pico Mask
| description = Bearing the visage of a werewolf-colored dragon, you feel scared just touching it.
| location = Near below [[Level 3 Ascent]]
| price = 400
| lead = The '''Moonlight Pico Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is one of the hardest mask to find among the 7 for the fact that it doesn't glow like the others.
| appearance = This mask has the shape of a brown-colored pico dragon from the game [https://cloudygamesllc.itch.io/dragon-drop Dragon Drop].
| obtain = *It is located behind a tree in an empty place under the "Wooden Branches" section in between [[Level 3 Ascent]] and [[Tower of Isolation]](On the East part of the map).
* To get to it, you can go to the "Wooden Branches" section and fall down from there, landing on the empty place where the mask lies.
* You can also teleport to [[Level 3 Ascent]] go Southeast and fall down to the zone there.
* You can also go from [[Bridge of Connection]] and fall down from there to the same place.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Moonlight Pico Mask Icon.png|The In-game icon of the mask
Moonlight Pico Mask Location.png|The surrounding of the location of the mask
Moonlight Pico Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This Mask's icon have a tint of light blue on it, while the actual mask is simply a brown pico mask.
*This Mask was initially intended to not be seasonal, however due to some certain players, it ended up being seasonal.
}}
7e318fc02ba2c753b9eb7b7892dcf2370fcdd6fc
File:Ghost Crest Mask Icon.png
6
202
275
2023-10-28T18:43:19Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Ghost Crest Mask Location.png
6
203
276
2023-10-28T18:47:34Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Ghost Crest Mask Showcase.png
6
204
277
2023-10-28T18:49:45Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Ghost Crest Mask
0
205
278
2023-10-28T19:07:48Z
Reduckilous
4
creating the page
wikitext
text/x-wiki
{{Mask
| name = Ghost Crest Mask
| description = A spooky mask featuring a spooky ghost. You try not to tremble with terror holding it.
| location = [[Floor 4 Beginning]]
| price = 400
| lead = The '''Ghost Crest Mask''' is one of the 7 Halloween masks released in October 2023. OOOooooOOoo SpO0okyyy...
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It's shapes resembles that of a ghost, but with small glowing eyes, making it rather...cute.
| obtain = *It is located right under the start of the conveyor belt going from [[Floor 4 Beginning]].
*To get it, go to [[Floor 4 Beginning]] and drop down at the direction of the conveyor belt(West).
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Ghost Crest Mask Icon.png|The In-game icon of the mask
Ghost Crest Mask Location.png|The surrounding of the location of the mask
Ghost Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
de109c8698785400f72dee9cb916da287aab192c
File:Creepy Smile Crest Mask Icon.png
6
206
279
2023-10-29T07:00:16Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Creepy Smile Crest Mask Location.png
6
207
280
2023-10-29T07:00:32Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Creepy Smile Crest Mask Showcase.png
6
208
281
2023-10-29T07:03:13Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Creepy Smile Crest Mask
0
209
282
2023-10-29T07:16:28Z
Reduckilous
4
Created page with "{{Mask | name = Creepy Smile Crest Mask | description = A mask that only has an unnerving grin on it, wear it at your own risk. | location = Above [[Bridge of Connection]] | price = 400 | lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out. | appearance = The appearance of the mask is inverted compared to its icon, similar to..."
wikitext
text/x-wiki
{{Mask
| name = Creepy Smile Crest Mask
| description = A mask that only has an unnerving grin on it, wear it at your own risk.
| location = Above [[Bridge of Connection]]
| price = 400
| lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. The mask only have a stripped smile in the middle of it.
| obtain = *It is located right above the little roof above the checkpoint at [[Bridge of Connection]].
*You can reach it by simply going to [[Refinery Overlook]] and going in reverse(North) to fall down on the roof where the mask lies.
*You can also [[Techs|Double Jump Stack]] up with another player from [[Bridge of Connection]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Creepy Smile Crest Mask Icon.png|The In-game icon of the mask
Creepy Smile Crest Mask Location.png|The surrounding of the location of the mask
Creepy Smile Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
6bf6c8fd0e216a1972e9cf9b5a1445f9c5c43945
File:Evil Eye Crest Mask Showcase.png
6
210
283
2023-10-29T08:17:08Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Evil Eye Crest Mask Icon.png
6
211
284
2023-10-29T08:17:42Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Evil Eye Crest Mask Location.png
6
212
285
2023-10-29T08:18:22Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Evil Eye Crest Mask
0
213
286
2023-10-29T08:19:55Z
Reduckilous
4
Creation of the page
wikitext
text/x-wiki
{{Mask
| name = Evil Eye Crest Mask
| description = A mask with a single terrifying, it peers into your soul.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest
| price = 400
| lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds.
| appearance = Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it.
| obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]].
*To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Evil Eye Crest Mask Icon.png|The In-game icon of the mask
Evil Eye Crest Mask Location.png|The surrounding of the location of the mask
Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
c5c38bd9445c8b368ce2e68425df2d4e6ca77412
287
286
2023-10-29T08:28:52Z
Reduckilous
4
Just adding some sentences
wikitext
text/x-wiki
{{Mask
| name = Evil Eye Crest Mask
| description = A mask with a single terrifying, it peers into your soul.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest
| price = 400
| lead = The appearance of the mask is inverted compared to its icon, similar to many other masks. The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds.
| appearance = Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it.
| obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]].
*To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Evil Eye Crest Mask Icon.png|The In-game icon of the mask
Evil Eye Crest Mask Location.png|The surrounding of the location of the mask
Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
0b74aa03d82c23ff1c1ccad3e51048d4a9310087
288
287
2023-10-29T08:29:58Z
Reduckilous
4
FIxing my last edit
wikitext
text/x-wiki
{{Mask
| name = Evil Eye Crest Mask
| description = A mask with a single terrifying, it peers into your soul.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest
| price = 400
| lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it.
| obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]].
*To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Evil Eye Crest Mask Icon.png|The In-game icon of the mask
Evil Eye Crest Mask Location.png|The surrounding of the location of the mask
Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
7a19a835f2dd2a89caf7a60099236b15d4f011fd
File:Skull Crest Mask Icon.png
6
214
289
2023-10-29T08:36:41Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Skull Crest Mask Location.png
6
215
290
2023-10-29T08:38:01Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Skull Crest Mask Showcase.png
6
216
291
2023-10-29T08:39:22Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Skull Crest Mask
0
217
292
2023-10-29T08:44:56Z
Reduckilous
4
Created page with "{{Mask | name = Skull Crest Mask | description = A mask bearing a festive face that fills you with a fondness for mischief. | location = [[Refinery Overlook]] - [[Level 4 Ending]] North | price = 400 | lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resemblance a human skull without the jaws. Ther..."
wikitext
text/x-wiki
{{Mask
| name = Skull Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for mischief.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] North
| price = 400
| lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resemblance a human skull without the jaws. There're also glowing circular eyes.
| obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot.
* To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies.
* You can also reach it by advancing from [[Refinery Overlook]] normally.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Skull Crest Mask Icon.png |The In-game icon of the mask
Skull Crest Mask Location.png|The surrounding of the location of the mask
Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
*The skull resemblance the skull emoji.
}}
b738bf68f4e6fe9ac2cd0a31b99183a032f86088
Dyes
0
218
293
2023-10-29T09:04:57Z
Reduckilous
4
Created page with "{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal Colors |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col..."
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal Colors
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffe03c; color: black" | [[Orange Dye|Orange]]
|[[Sanctum Overlook]], next to the NPC with the same dye color.
|72
|Easy
507926151cc6b6087d07c2a7a32b5cff98ab1250
File:Orange Dye.png
6
219
294
2023-10-29T09:15:03Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
295
294
2023-10-29T09:43:53Z
Reduckilous
4
Reduckilous moved page [[File:Orange dye.png]] to [[File:Orange Dye.png]]: Misspelled title
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Orange dye.png
6
220
296
2023-10-29T09:43:54Z
Reduckilous
4
Reduckilous moved page [[File:Orange dye.png]] to [[File:Orange Dye.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Orange Dye.png]]
d7209201ceb781ab57f5a92b7ff32513a459ee20
File:Orange Dye Full Showcase.png
6
221
297
2023-10-29T09:48:27Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Orange Dye Showcase.png
6
222
298
2023-10-29T09:48:46Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Orange Dye Witness.png
6
223
299
2023-10-29T09:48:59Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Orange Dye Location.png
6
224
300
2023-10-29T09:50:36Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Orange Dye Bottle.png
6
225
301
2023-10-29T09:54:05Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Orange Dye
0
226
302
2023-10-29T10:06:37Z
Reduckilous
4
Created page with "{{Infobox | bodystyle = background-color:#0B2347; color:#FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Orange Dye | name = Orange Dye | image = [[File:Orange Dye.png|200px]] | label1 = Min graphic hex | data1 = <nowiki>#3472AD</nowiki> | label2 = Max graphic hex | data2 = <nowiki>#ffe03c</nowiki> | label3 = Location | data3 = [[Sanctum Overlook]] | label4 = Price | data4 = 0AE }} The Orange Dye is the first ever seasonal dye to ev..."
wikitext
text/x-wiki
{{Infobox
| bodystyle = background-color:#0B2347; color:#FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = Orange Dye
| name = Orange Dye
| image = [[File:Orange Dye.png|200px]]
| label1 = Min graphic hex
| data1 = <nowiki>#3472AD</nowiki>
| label2 = Max graphic hex
| data2 = <nowiki>#ffe03c</nowiki>
| label3 = Location
| data3 = [[Sanctum Overlook]]
| label4 = Price
| data4 = 0AE
}}
The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color.
<h2> Obtainment </h2>
*It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]].
<h2> Gallery </h2>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Orange Dye Bottle.png|The Dye Bottle
Orange Dye Showcase.png|Showcasing the Dye without accessories
Orange Dye Full Showcase.png|Showcasing the Dye with accessories
Orange Dye Witness.png|A Witness with the dye
Orange Dye Location.png|The Dye's location
</gallery>
<h2> Trivia </h2>
*The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released.
213ac7073da20c6678bf08482c6279b701484ffa
File:Abital's Mask.png
6
227
303
2023-11-02T16:41:39Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
306
303
2023-11-02T16:49:09Z
Reduckilous
4
Reduckilous uploaded a new version of [[File:Abital's Mask.png]]
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Abyssal Mask.png
6
228
304
2023-11-02T16:42:45Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
305
304
2023-11-02T16:48:18Z
Reduckilous
4
Reduckilous uploaded a new version of [[File:Abyssal Mask.png]]
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Ancient Grace.png
6
229
307
2023-11-02T17:24:26Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Ancient Relic Mask.png
6
230
308
2023-11-02T17:24:35Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Apple Pico Mask.png
6
231
309
2023-11-02T17:24:42Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Arrow Crest Mask.png
6
232
310
2023-11-02T17:25:02Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Bard Crest Mask.png
6
233
311
2023-11-02T17:25:09Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
343
311
2023-11-07T12:05:26Z
Reduckilous
4
Reduckilous moved page [[File:Bard Crest Mask .png]] to [[File:Bard Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Blueberry Pico Mask.png
6
234
312
2023-11-02T17:25:18Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Circle Crest Mask.png
6
235
313
2023-11-02T17:25:36Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Connection Crest Mask.png
6
236
314
2023-11-02T17:25:42Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Court Crest Mask.png
6
237
315
2023-11-02T17:25:54Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Direction Crest Mask.png
6
238
316
2023-11-02T17:26:00Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Dot Crest Mask.png
6
239
317
2023-11-02T17:26:14Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Fire Kanji Mask.png
6
240
318
2023-11-02T17:27:10Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
348
318
2023-11-09T11:01:11Z
Reduckilous
4
Reduckilous moved page [[File:Fire Crest Mask.png]] to [[File:Fire Kanji Mask.png]]: Misspelled title
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Golem Pico Mask.png
6
241
319
2023-11-02T17:27:19Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Gradient Mask Red.png
6
242
320
2023-11-02T17:27:28Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Green Square.png
6
243
321
2023-11-02T17:27:40Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Gumball Pico Mask.png
6
244
322
2023-11-02T17:27:53Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Line Crest Mask.png
6
245
323
2023-11-02T17:28:06Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Location Crest Mask.png
6
246
324
2023-11-02T17:28:22Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Magma Pico Mask.png
6
247
325
2023-11-02T17:28:36Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Mask of Prestige Awakened Form.png
6
248
326
2023-11-02T17:28:53Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Mask of Prestige Dormant Form.png
6
249
327
2023-11-02T17:28:59Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Mask of Truth.png
6
250
328
2023-11-02T17:29:07Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Melon Pico Mask.png
6
251
329
2023-11-02T17:29:17Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Pale Blue Mask.png
6
252
330
2023-11-02T17:29:33Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Rei's Mask.png
6
253
331
2023-11-02T17:29:49Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Runic Mask.png
6
254
332
2023-11-02T17:30:14Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Sandy Pico Mask.png
6
255
333
2023-11-02T17:30:22Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Smilling Crest Mask.png
6
256
334
2023-11-02T17:30:35Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Square Crest Mask.png
6
257
335
2023-11-02T17:30:46Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Visage of Apathy.png
6
258
336
2023-11-02T17:31:00Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Visage of Joy.png
6
259
337
2023-11-02T17:31:13Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Visage of Sorrow.png
6
260
338
2023-11-02T17:32:08Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Warrior Mask Orange.png
6
261
339
2023-11-02T17:32:18Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Wren's Mask.png
6
262
340
2023-11-02T17:32:24Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Masks
0
169
341
221
2023-11-03T12:13:43Z
Reduckilous
4
Temporary placing template on the table
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|+ style="color:#0B2347; text-align: Left; font-size:20px" | Normal masks
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|}
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
6652b4ed61dd358a28f974430482462d7e72125d
342
341
2023-11-06T11:00:26Z
Reduckilous
4
changing the heading
wikitext
text/x-wiki
== Normal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|-
| [[Masks]]
| [[File:Placeholder.png|100px|link=[[Masks]]]]
|
* Located
* Can be
| meter
|difficulty
|}
== Seasonal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
2a962073cb3c8454e0106b5fe4e4b5dd1e0a19d5
345
342
2023-11-07T15:50:56Z
Reduckilous
4
Finishing up the normal mask section
wikitext
text/x-wiki
== Normal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
== Seasonal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
1d2cbe288bb1aaa5ef28e2c1c3267bc32dc7eb30
347
345
2023-11-08T14:11:08Z
Reduckilous
4
W.I.P
wikitext
text/x-wiki
== Normal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
==Challenge Masks==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Challenge
|-
| [[Visage of Apathy]]
| [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s altar.
|-
| [[Visage of Sorrow]]
| [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s altar.
|-
| [[Visage of Joy]]
| [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s altar.
|}
== Seasonal Masks ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
==Misc Masks==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Gumball Pico Mask]]
| [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]]
| Obtained by entering a certain code in the game [[Journey to the sun]]
c48529b67a14a7d5396af11f864e802eb4ec15c0
File:Bard Crest Mask .png
6
263
344
2023-11-07T12:05:26Z
Reduckilous
4
Reduckilous moved page [[File:Bard Crest Mask .png]] to [[File:Bard Crest Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Bard Crest Mask.png]]
6fc7e59b0813a30a9beadc823458388a6b9558be
Template:Mask
10
192
346
270
2023-11-08T06:00:55Z
2.50.175.15
0
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Appearance==
{{{appearance|}}}
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
7ca41d5ebf1a6579cd00d028fca5a5d3e9683e80
File:Fire Crest Mask.png
6
264
349
2023-11-09T11:01:12Z
Reduckilous
4
Reduckilous moved page [[File:Fire Crest Mask.png]] to [[File:Fire Kanji Mask.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Fire Kanji Mask.png]]
6f67456378f930941ddcb496429a0579f7010400
File:Neon Pico Mask.png
6
265
350
2023-11-09T12:58:56Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Dragon Drop Crest Mask.png
6
266
351
2023-11-09T13:06:18Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Wren's Mask.png
6
262
352
340
2023-11-09T13:29:28Z
Reduckilous
4
Reduckilous moved page [[File:Wren Mask.png]] to [[File:Wren's Mask.png]]
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Wren Mask.png
6
267
353
2023-11-09T13:29:28Z
Reduckilous
4
Reduckilous moved page [[File:Wren Mask.png]] to [[File:Wren's Mask.png]]
wikitext
text/x-wiki
#REDIRECT [[File:Wren's Mask.png]]
91f3f3f8e589ba1a090655cac7130f91630ff425
File:Mask of Truth.png
6
250
354
328
2023-11-09T13:30:07Z
Reduckilous
4
Reduckilous moved page [[File:Mask's of Truth.png]] to [[File:Mask of Truth.png]]: Misspelled title
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Mask's of Truth.png
6
268
355
2023-11-09T13:30:07Z
Reduckilous
4
Reduckilous moved page [[File:Mask's of Truth.png]] to [[File:Mask of Truth.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Mask of Truth.png]]
a48a9fd27e46f9b91160d5556f87d07877415d9d
Masks
0
169
356
347
2023-11-09T13:47:16Z
Reduckilous
4
wikitext
text/x-wiki
== Normal Masks ==
Normal Masks can be found anywhere in the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable of Abyssal along with wings and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
==Challenge Masks==
Challenge Masks are only obtainable through completion of challenges. They usually resemble a Sid expression.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Challenge
|-
| [[Visage of Apathy]]
| [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar.
|-
| [[Visage of Sorrow]]
| [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar.
|-
| [[Visage of Joy]]
| [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar.
|}
== Seasonal Masks ==
Season Masks are only obtainable in a certain annual season or events.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
==Misc Masks==
Misc Masks includes masks that do not fits into any of the above sections. They include purchasable masks, Loyalty Rewards, and promotional masks.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Fire Kanji Mask]]
| [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends| Welcome To Toast Your Friends]] badge from the game [[https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends| Toast Your Friends]].
|-
| [[Green Square]]
| [[File:Green Square.png|100px|link=[[Green Square]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537200/Collect-10-Coins| Collect 10 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Pale Blue Mask]]
| [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Gradient Mask Red]]
| [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Warrior Mask Orange]]
| [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537203/Collect-75-Coins| Collect 75 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Ancient Relic Mask]]
| [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537204/Collect-ALL-Coins| Collect ALL Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Ancient Grace]]
| [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537205/Reach-the-Sun| Reach the Sun]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Gumball Pico Mask]]
| [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector| Gumball Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Melon Pico Mask]]
| [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector| Melon Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Mask of Prestige Dormant Form]]
| [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020608/Begin-Again| Begin-Again]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Mask of Prestige Awakened Form]]
| [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020662/Seventh-Heaven| Seventh Heaven]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Wren's Mask]]
| [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed| Metaverse 2021 Event Completed]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. No longer obtainable.
|-
| [[Dragon Drop Crest Mask]]
| [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks.
|-
| [[Neon Pico Mask]]
| [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks.
|-
| [[Runic Mask]]
| [[File:Runic Mask.png|100px|link=[[Runic Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/247799076/Runic-Set| Runic Set]].
|-
| [[Abital's Mask]]
| [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/12778368/Abitals-Set| Abital's set]].
|-
| [[Rei's Mask]]
| [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel| Rei's Set]].
|-
| [[Mask of Truth]]
| [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/12775128/Truth-Set| Truth Set]].
|}
0dbce2057350c0b942580b049e047b5bc9824ccb
357
356
2023-11-09T15:01:05Z
Silentg
2
/* Misc Masks */
wikitext
text/x-wiki
== Normal Masks ==
Normal Masks can be found anywhere in the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable of Abyssal along with wings and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
==Challenge Masks==
Challenge Masks are only obtainable through completion of challenges. They usually resemble a Sid expression.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Challenge
|-
| [[Visage of Apathy]]
| [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar.
|-
| [[Visage of Sorrow]]
| [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar.
|-
| [[Visage of Joy]]
| [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar.
|}
== Seasonal Masks ==
Season Masks are only obtainable in a certain annual season or events.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
==Miscellaneous Masks==
Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Fire Kanji Mask]]
| [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends| Welcome To Toast Your Friends]] badge from the game [[https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends| Toast Your Friends]].
|-
| [[Green Square]]
| [[File:Green Square.png|100px|link=[[Green Square]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537200/Collect-10-Coins| Collect 10 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Pale Blue Mask]]
| [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Gradient Mask Red]]
| [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Warrior Mask Orange]]
| [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537203/Collect-75-Coins| Collect 75 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Ancient Relic Mask]]
| [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537204/Collect-ALL-Coins| Collect ALL Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Ancient Grace]]
| [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537205/Reach-the-Sun| Reach the Sun]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Gumball Pico Mask]]
| [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector| Gumball Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Melon Pico Mask]]
| [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector| Melon Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Mask of Prestige Dormant Form]]
| [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020608/Begin-Again| Begin-Again]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Mask of Prestige Awakened Form]]
| [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020662/Seventh-Heaven| Seventh Heaven]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]].
|-
| [[Wren's Mask]]
| [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]]
| Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed| Metaverse 2021 Event Completed]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. No longer obtainable.
|-
| [[Dragon Drop Crest Mask]]
| [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks.
|-
| [[Neon Pico Mask]]
| [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks.
|-
| [[Runic Mask]]
| [[File:Runic Mask.png|100px|link=[[Runic Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/247799076/Runic-Set| Runic Set]].
|-
| [[Abital's Mask]]
| [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/12778368/Abitals-Set| Abital's set]].
|-
| [[Rei's Mask]]
| [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel| Rei's Set]].
|-
| [[Mask of Truth]]
| [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]]
| Obtained from buying the [[https://www.roblox.com/game-pass/12775128/Truth-Set| Truth Set]].
|}
91ce10e080b6ed58c74bc45b5e3d40caa240dc6b
362
357
2023-11-09T15:25:56Z
Silentg
2
wikitext
text/x-wiki
{{See also|Wings|Dyes}}
Masks are one of the three main cosmetics in the game.
== Normal Masks ==
Normal masks can be found in certain locations around the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable cosmetics along with wings and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
==Challenge Masks==
Challenge masks are only obtainable through the completion of challenges. They usually resemble a Sid expression.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Challenge
|-
| [[Visage of Apathy]]
| [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar.
|-
| [[Visage of Sorrow]]
| [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar.
|-
| [[Visage of Joy]]
| [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar.
|}
== Seasonal Masks ==
Seasonal masks are masks that are only obtainable during a certain annual season or event.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
==Miscellaneous Masks==
Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Fire Kanji Mask]]
| [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends Welcome To Toast Your Friends]] badge from the game [https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends Toast Your Friends].
|-
| [[Green Square]]
| [[File:Green Square.png|100px|link=[[Green Square]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537200/Collect-10-Coins Collect 10 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Pale Blue Mask]]
| [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Gradient Mask Red]]
| [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Warrior Mask Orange]]
| [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537203/Collect-75-Coins Collect 75 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Ancient Relic Mask]]
| [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537204/Collect-ALL-Coins Collect ALL Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Ancient Grace]]
| [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537205/Reach-the-Sun Reach the Sun] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Gumball Pico Mask]]
| [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector Gumball Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Melon Pico Mask]]
| [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector Melon Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Mask of Prestige Dormant Form]]
| [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020608/Begin-Again Begin-Again] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Mask of Prestige Awakened Form]]
| [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020662/Seventh-Heaven Seventh Heaven] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Wren's Mask]]
| [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed Metaverse 2021 Event Completed] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. No longer obtainable.
|-
| [[Dragon Drop Crest Mask]]
| [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks.
|-
| [[Neon Pico Mask]]
| [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks.
|-
| [[Runic Mask]]
| [[File:Runic Mask.png|100px|link=[[Runic Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set].
|-
| [[Abital's Mask]]
| [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set].
|-
| [[Rei's Mask]]
| [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set].
|-
| [[Mask of Truth]]
| [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set].
|}
f59dbc6e041fb084b7264bcaba68c3580de6fa3d
363
362
2023-11-09T17:24:32Z
Reduckilous
4
nitpicking here and there lol
wikitext
text/x-wiki
{{See also|Wings|Dyes}}
Masks are one of the three main cosmetics in the game.
== Normal Masks ==
Normal masks can be found in certain locations around the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable cosmetics along with wings and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Abyssal Mask]]
| [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Square Crest Mask]]
| [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Line Crest Mask]]
| [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Location Crest Mask]]
| [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]]
|
* Located below the section before [[Sanctum Overlook]].
* Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms.
|19
|Medium
|-
| [[Court Crest Mask]]
| [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]]
|
* Located on a 2 player required section in [[Sanctum Overlook]].
* Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help.
|93
|Medium
|-
| [[Arrow Crest Mask]]
| [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]]
|
* Located in the room directly above the Dye Store in [[Level 2 Ascent]]
* Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies.
|178
|Easy
|-
| [[Circle Crest Mask]]
| [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]]
|
* Located on one of the arch beam in the hall behind [[Witness Store]].
* Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies.
| 310
|Medium
|-
| [[Connection Crest Mask]]
| [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]]
|
* Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]]
* Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in.
|286
|Easy
|-
| [[Direction Crest Mask]]
| [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]]
|
* Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]].
* Can be obtained by making it through the parkour section with the help of another player.
|698
|Easy
|-
| [[Bard Crest Mask]]
| [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]]
|
* Located on the support beams on the very North of [[Bridge of Connection]].
* Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask.
|752
|Medium
|-
| [[Smilling Crest Mask]]
| [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]]
|
* Located lower Southeast from [[Floor 4 Beginning]].
* Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies.
|783
|Easy
|-
| [[Dot Crest Mask]]
| [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]]
|
* Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]].
* Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies.
|681
|Medium
|-
| [[Magma Pico Mask]]
| [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]]
|
* Located in the [[Hall of Loyalty]].
* Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column.
| 1
|Medium
|-
| [[Apple Pico Mask]]
| [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]]
|
* Located at the very end of the hallway that's started from the hall next to [[Witness Store]].
* Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies.
| 287
|Medium
|-
| [[Blueberry Pico Mask]]
| [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]]
|
* Located on the second floor of the building that's on the north of [[Beginner's Grotto]].
* Can be reached by falling from the South of [[Level 3 Ascent]].
|47
|Medium
|-
| [[Sandy Pico Mask]]
| [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]]
|
* Located on the wall below [[Floor 4 Beginning]]
* Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides.
|583
|Hard
|-
| [[Golem Pico Mask]]
| [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]]
|
* Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]].
* Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask.
|980
|Hard
|}
==Challenge Masks==
Challenge masks are only obtainable through the completion of challenges. They usually resemble a Sid expression.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Challenge
|-
| [[Visage of Apathy]]
| [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar.
|-
| [[Visage of Sorrow]]
| [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar.
|-
| [[Visage of Joy]]
| [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]]
| Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar.
|}
== Seasonal Masks ==
Seasonal masks are masks that are only obtainable during a certain annual season or event.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Jack O’ Lantern Crest Mask]]
| [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]
|
* Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].
* Can be obtained the quickest by falling down the bridge near [[Witness Store]].
| 19
| Easy
|-
| [[Owl Crest Mask]]
| [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]
| Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it.
| 63
| Easy
|-
| [[Moonlight Pico Mask]]
| [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]
|
* Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.
* Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.
| 312
| Medium
|-
| [[Ghost Crest Mask]]
| [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]
| Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.
| 783
| Easy
|-
| [[Creepy Smile Crest Mask]]
| [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]
|
* Located directly above [[Bridge of Connection]].
* Can be reached from falling near [[Refinery Overlook]].
| 805
| Medium
|-
| [[Evil Eye Crest Mask]]
| [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]
| Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].
| 1040
| Easy
|-
| [[Skull Crest Mask]]
| [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]
|
* Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].
* Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.
| 1175
| Easy
|}
==Miscellaneous Masks==
Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Fire Kanji Mask]]
| [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends Welcome To Toast Your Friends] badge from the game [https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends Toast Your Friends].
|-
| [[Green Square]]
| [[File:Green Square.png|100px|link=[[Green Square]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537200/Collect-10-Coins Collect 10 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Pale Blue Mask]]
| [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Gradient Mask Red]]
| [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Warrior Mask Orange]]
| [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537203/Collect-75-Coins Collect 75 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Ancient Relic Mask]]
| [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537204/Collect-ALL-Coins Collect ALL Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Ancient Grace]]
| [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537205/Reach-the-Sun Reach the Sun] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Gumball Pico Mask]]
| [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector Gumball Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Melon Pico Mask]]
| [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector Melon Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Mask of Prestige Dormant Form]]
| [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020608/Begin-Again Begin Again] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Mask of Prestige Awakened Form]]
| [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020662/Seventh-Heaven Seventh Heaven] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun].
|-
| [[Wren's Mask]]
| [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed Metaverse 2021 Event Completed] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. No longer obtainable.
|-
| [[Dragon Drop Crest Mask]]
| [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks.
|-
| [[Neon Pico Mask]]
| [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]]
| Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks.
|-
| [[Runic Mask]]
| [[File:Runic Mask.png|100px|link=[[Runic Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set].
|-
| [[Abital's Mask]]
| [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set].
|-
| [[Rei's Mask]]
| [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set].
|-
| [[Mask of Truth]]
| [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set].
|}
7ff13e8ccbb69cd57798383dfe593a56eefca0b7
Template:See also
10
269
358
2023-11-09T15:11:24Z
Silentg
2
Created page with "<includeonly>{{#invoke:Labelled list hatnote|labelledList|See also}}</includeonly><noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>"
wikitext
text/x-wiki
<includeonly>{{#invoke:Labelled list hatnote|labelledList|See also}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
74d2ab6a0df5605fbe2085c405925ec659be52b7
Template:See also/doc
10
270
359
2023-11-09T15:11:46Z
Silentg
2
Created page with "{{documentation subpage}} {{used in system|in [[MediaWiki:wantedpages-summary]]}} {{lua|Module:Labelled list hatnote}} This template is used to create '''[[WP:Hatnotes|hatnotes]] to point to a small number of other related titles''' at the '''top of article ''[[Help:Section|sections]]''''' (excluding the [[WP:LEAD|lead]]). It looks like this: {{See also|Article}} Do not use this template on top of a page, where hatnotes are for disambiguation and not for related topic..."
wikitext
text/x-wiki
{{documentation subpage}}
{{used in system|in [[MediaWiki:wantedpages-summary]]}}
{{lua|Module:Labelled list hatnote}}
This template is used to create '''[[WP:Hatnotes|hatnotes]] to point to a small number of other related titles''' at the '''top of article ''[[Help:Section|sections]]''''' (excluding the [[WP:LEAD|lead]]). It looks like this:
{{See also|Article}}
Do not use this template on top of a page, where hatnotes are for disambiguation and not for related topics (according to [[WP:RELATED]]). Do not use this template inside [[Wikipedia:Manual of Style/Layout#"See also" section|the ''"See also" section'']] at the end of an article, or for links to other articles or subsections of the same article within regular article text. Where subsections are linked to, [[Template:Section link]] may be suitable instead. For use on category pages, the corresponding template is [[Template:Category see also]].
Refer to the examples below to see how the template handles link targets containing section links and commas.
==Usage==
{{see|WP:SUMMARYHATNOTE}}
; Basic usage:
{{See also|''page1''|''page2''|''page3''|...}}
; All parameters:
{{See also|''page1''|''page2''|''page3''| ...
|label 1 = ''label 1''|label 2 = ''label2''|label 3 = ''label3''| ...
|l1 = ''label1''|l2 = ''label2''|l3 = ''label3''| ...
|selfref = ''yes''|category = ''no''}}
==Parameters==
This template accepts the following parameters:
* <code>1</code>, <code>2</code>, <code>3</code>, ... – the pages to link to. At least one page name is required. Categories and files are automatically escaped with the [[Help:Colon trick|colon trick]], and links to sections are automatically formatted as ''page § section'', rather than the MediaWiki default of ''page#section''.
* <code>label 1</code>, <code>label 2</code>, <code>label 3</code>, ...; or <code>l1</code>, <code>l2</code>, <code>l3</code>, ...; optional labels for each of the pages to link to.
* <code>selfref</code> – if set to "yes", "y", "true" or "1", adds the CSS class "selfref". This is used to denote self-references to Wikipedia. See [[Template:Selfref]] for more information.
* <code>category</code> – if set to "no", "n", "false", or "0", suppresses the error tracking category ([[:Category:Hatnote templates with errors]]). This only has an effect if the first positional parameter (the page to link to) is omitted.
== Examples ==
* <code><nowiki>{{See also|Article}}</nowiki></code> → {{See also|Article}}
* <code><nowiki>{{See also|Article#Section}}</nowiki></code> → {{See also|Article#Section}}
* <code><nowiki>{{See also|Article#Section|label 1=Custom section label}}</nowiki></code> → {{See also|Article#Section|label 1=Custom section label}}
* <code><nowiki>{{See also|Article1|Article2|Article3}}</nowiki></code> → {{See also|Article1|Article2|Article3}}
* <code><nowiki>{{See also|Article1|Article,2|Article3}}</nowiki></code> → {{See also|Article1|Article,2|Article3}}
* <code><nowiki>{{See also|Article1|l1=Custom label 1|Article2|l2=Custom label 2}}</nowiki></code> → {{See also|Article1|l1=Custom label 1|Article2|l2=Custom label 2}}
* <code><nowiki>{{See also|Veni, vidi, vici|Julius Caesar}}</nowiki></code> → {{See also|Veni, vidi, vici|Julius Caesar}}
* <code><nowiki>{{See also|Veni, vidi, vici|Julius Caesar#Civil war}}</nowiki></code> → {{See also|Veni, vidi, vici|Julius Caesar#Civil war}}
* <code><nowiki>{{See also|Julius Caesar#Civil war|Veni, vidi, vici}}</nowiki></code> → {{See also|Julius Caesar#Civil war|Veni, vidi, vici}}
* <code><nowiki>{{See also|Julius Caesar#Civil war|Crossing the Rubicon}}</nowiki></code> → {{See also|Julius Caesar#Civil war|Crossing the Rubicon}}
==Errors==
If no page names are supplied, the template outputs the following message with the (help) wikilink pointing to the "Errors" section of this page:
*{{See also|category=no}}
If you see this error message, it is for one of three reasons:
# No parameters were specified (the template code was <code><nowiki>{{See also}}</nowiki></code> with no pipe character nor page to link to). Please use <code><nowiki>{{See also|</nowiki>''page''<nowiki>}}</nowiki></code> instead.
# Some parameters were specified, but no page names were included. For example, the template text <code><nowiki>{{See also|selfref=yes}}</nowiki></code> will produce this error. Please use (for example) <code><nowiki>{{See also|</nowiki>''page''<nowiki>|selfref=yes}}</nowiki></code> instead.
# A page name was specified, but it contains an equals sign ("="). The equals sign has a special meaning in template code, and because of this it cannot be used in template parameters that do not specify a parameter name. For example, the template code <code><nowiki>{{See also|1+1=2|2+2=4}}</nowiki></code> will produce this error. To work around this, you can specify the parameter name explicitly by using <code>1=</code>, <code>2</code>, etc., before the page name, like this: <code><nowiki>{{See also|1=1+1=2|2=2+2=4}}</nowiki></code>.
If you see this error message and are unsure of what to do, please post a message on [[WP:HD|the help desk (WP:HD)]], and someone should be able to help you.
To see a list of wikilinks to articles that contain this error message, see the [[Wikipedia:Maintenance|maintenance category]]: [[:Category:Hatnote templates with errors]].
==TemplateData==
{{Collapse top|[[Wikipedia:TemplateData|TemplateData]] documentation used by [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>
{
"description": "This template creates a hatnote to point to a small number of related pages. It is placed at the top of a section, directly underneath the section heading.",
"params": {
"1": {
"label": "Page 1",
"description": "The name of the first page that you want to link to.",
"type": "wiki-page-name",
"required": true,
"example": "Article name"
},
"2": {
"label": "Page 2",
"description": "The name of the second page that you want to link to.",
"type": "wiki-page-name",
"required": false
},
"3": {
"label": "Page 3",
"description": "The name of the third page that you want to link to. More pages can be added using the parameters \"4\", \"5\", \"6\", etc.",
"type": "wiki-page-name",
"required": false
},
"label 1": {
"label": "Label 1",
"type": "string",
"description": "What the first linked article is to be displayed as. ",
"aliases": [
"l1"
]
},
"label 2": {
"label": "Label 2",
"type": "string",
"description": "What the second linked article is to be displayed as.",
"aliases": [
"l2"
]
},
"label 3": {
"aliases": [
"l3"
],
"type": "string",
"label": "Label 3",
"description": "What the third linked article is to be displayed as. Other labels can be added by using increasing numbers (starting with \"label 4\" or \"l4\" for page 4) as parameter names."
},
"selfref": {
"type": "boolean",
"label": "Self reference",
"description": "Set to \"yes\" if the template is a self-reference to Wikipedia that would not make sense on mirrors or forks of the Wikipedia site.",
"example": "yes",
"default": "no"
},
"category": {
"label": "Category",
"description": "Set to \"no\", \"n\", \"false\", or \"0\" to suppresses the error tracking category (Category:Hatnote templates with errors). This only has an effect if no page names are specified.",
"type": "boolean",
"default": "yes",
"example": "no"
}
},
"format": "inline"
}
</templatedata>
{{Collapse bottom}}
==See also==
*{{tl|For}}
*{{tl|See also if exists}}
*{{t|Further}}
*{{tl|Template see also}}
*{{tl|Category see also}}
*{{tl|Main}}
*{{tl|See}} (redirect to {{tl|Further}})
*{{tl|Hatnote}}
{{Hatnote templates}}
<includeonly>{{Sandbox other||
<!-- Categories go here and interwikis go in Wikidata. -->
[[Category:Hatnote templates]]
[[Category:Related-topic templates]]
[[Category:Wikipedia page-section templates]]
[[Category:Wikipedia see also]]
}}</includeonly>
8e7cb32ca0af3f18a7bc8a6a67105914d660c533
Module:Labelled list hatnote
828
271
360
2023-11-09T15:12:36Z
Silentg
2
Created page with "-------------------------------------------------------------------------------- -- Labelled list -- -- -- -- This module does the core work of creating a hatnote composed of a list -- -- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", -- -- for {{see also}} and similar templates...."
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Labelled list --
-- --
-- This module does the core work of creating a hatnote composed of a list --
-- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", --
-- for {{see also}} and similar templates. --
--------------------------------------------------------------------------------
local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments --initialize lazily
local yesno --initialize lazily
local p = {}
-- Defaults global to this module
local defaults = {
label = 'See also', --Final fallback for label argument
labelForm = '%s: %s',
prefixes = {'label', 'label ', 'l'},
template = 'Module:Labelled list hatnote'
}
-- Localizable message strings
local msg = {
errorSuffix = '#Errors',
noInputWarning = 'no page names specified',
noOutputWarning =
"'''[[%s]] — no output: none of the target pages exist.'''"
}
-- Helper function that pre-combines display parameters into page arguments.
-- Also compresses sparse arrays, as a desirable side-effect.
function p.preprocessDisplays (args, prefixes)
-- Prefixes specify which parameters, in order, to check for display options
-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'
prefixes = prefixes or defaults.prefixes
local indices = {}
local sparsePages = {}
for k, v in pairs(args) do
if type(k) == 'number' then
indices[#indices + 1] = k
local display
for i = 1, #prefixes do
display = args[prefixes[i] .. k]
if display then break end
end
sparsePages[k] = display and
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
end
end
table.sort(indices)
local pages = {}
for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end
return pages
end
--Helper function to get a page target from a processed page string
--e.g. "Page|Label" → "Page" or "Target" → "Target"
local function getTarget(pagename)
local pipe = string.find(pagename, '|')
return string.sub(pagename, 0, pipe and pipe - 1 or nil)
end
-- Produces a labelled pages-list hatnote.
-- The main frame (template definition) takes 1 or 2 arguments, for a singular
-- and (optionally) plural label respectively:
-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}
-- The resulting template takes pagename & label parameters normally.
function p.labelledList (frame)
mArguments = require('Module:Arguments')
yesno = require('Module:Yesno')
local labels = {frame.args[1] or defaults.label}
labels[2] = frame.args[2] or labels[1]
labels[3] = frame.args[3] --no defaulting
labels[4] = frame.args[4] --no defaulting
local template = frame:getParent():getTitle()
local args = mArguments.getArgs(frame, {parentOnly = true})
local pages = p.preprocessDisplays(args)
local options = {
category = yesno(args.category),
extraclasses = frame.args.extraclasses,
ifexists = yesno(frame.args.ifexists),
namespace = frame.args.namespace or args.namespace,
selfref = yesno(frame.args.selfref or args.selfref),
template = template
}
return p._labelledList(pages, labels, options)
end
function p._labelledList (pages, labels, options)
if options.ifexists then
for k = #pages, 1, -1 do --iterate backwards to allow smooth removals
local v = pages[k]
local title = mw.title.new(getTarget(v), namespace)
if (v == '') or title == nil or not title.exists then
table.remove(pages, k)
end
end
end
labels = labels or {}
label = (#pages == 1 and labels[1] or labels[2]) or defaults.label
for k, v in pairs(pages) do
if mHatnote.findNamespaceId(v) ~= 0 then
label =
(
#pages == 1 and
(labels[3] or labels[1] or defaults.label) or
(labels[4] or labels[2] or defaults.label)
) or defaults.label
end
end
if #pages == 0 then
if options.ifexists then
mw.addWarning(
string.format(
msg.noOutputWarning, options.template or defaults.template
)
)
return ''
else
return mHatnote.makeWikitextError(
msg.noInputWarning,
(options.template or defaults.template) .. msg.errorSuffix,
options.category
)
end
end
local text = string.format(
options.labelForm or defaults.labelForm,
label,
mHatlist.andList(pages, true)
)
local hnOptions = {
extraclasses = options.extraclasses,
selfref = options.selfref
}
return mHatnote._hatnote(text, hnOptions)
end
return p
b7a8ba27cf6195e6427701b94e8d2acad3c40a21
Module:Labelled list hatnote/doc
828
272
361
2023-11-09T15:13:01Z
Silentg
2
Created page with "{{module rating|protected}} {{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{Lua|Module:Hatnote|Module:Hatnote list|Module:Arguments}} This module provides a handful of functions that make it easy to implement hatnotes that take the form of a label in front of a list of pages, e.g. {{hatnote|LABEL: [[A]], [[B]], and [[C]]}} == Usage == ===labelledList=== Invoking the <code>labelledList()</code> function is enough to implement most such templates: <code><now..."
wikitext
text/x-wiki
{{module rating|protected}}
{{used in system|in [[MediaWiki:Wantedpages-summary]]}}
{{Lua|Module:Hatnote|Module:Hatnote list|Module:Arguments}}
This module provides a handful of functions that make it easy to implement hatnotes that take the form of a label in front of a list of pages, e.g. {{hatnote|LABEL: [[A]], [[B]], and [[C]]}}
== Usage ==
===labelledList===
Invoking the <code>labelledList()</code> function is enough to implement most such templates:
<code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Universal label}}</nowiki></code>
or
<code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}</nowiki></code>
For example, providing "See also" instead of "Universal label" duplicates the functionality of {{tl|see also}}, while providing "Main article" and "Main articles" instead of "Singular label" and "Plural label" duplicates the (article namespace) functionality of {{tl|main}}.
If third and fourth labels are provided, they'll be used in the case where any of the target pages are outside the article namespace, so e.g. {{tl|main}} can be implemented thus:
<code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}}</nowiki></code>
===preprocessDisplays===
The <code>preprocessDisplays()</code> function takes a raw list of arguments and combines in any display arguments. For example, {{tlx|see also|1|<nowiki>l1=One</nowiki>}} initially has the arguments table <code><nowiki>{'1', ['l1'] = 'One'}</nowiki></code>; this table would combine those into the table <code><nowiki>{'1|One'}</nowiki></code>. It overrides manual piping (e.g. {{tlx|see also|<nowiki>1{{!}}2</nowiki>|<nowiki>l1=One</nowiki>}} → <code><nowiki>{'1|One'}</nowiki></code>) and compresses sparse arrays if a parameter is skipped or left empty.
Example: <syntaxhighlight lang="lua">
local mLabelledList = require('Module:Labelled list hatnote')
local pages = mLabelledList.preprocessDisplays(args)
</syntaxhighlight>
===_labelledList===
For modules that need to modify the functionality slightly while still using it, <code>_labelledList()</code> provides some flexibility. It takes three parameters:
# A pages list, preferably preprocessed and compressed by <code>preprocessDisplays</code>
# A labels table, where the first item is the singular or universal label, and the second either a plural label or a copy of the first.
# An options table, preferably containing:
#* a <code>template</code> string with the full title of the template. Defaults to the title of this module.
#* a <code>category</code> string (or nil) as taken by <code>makeWikitextError</code> from [[Module:Hatnote]], to optionally disable error categories
#* a <code>selfref</code> string (or nil) as taken by <code>_hatnote</code> to enable the selfref option
Example: <syntaxhighlight lang="lua">
local mLabelledList = require('Module:Labelled list hatnote')
return mLabelledList._labelledList(pages, labels, options)
</syntaxhighlight>
==Errors==
This module causes templates based on it to produce an error message if no page names are provided as template parameters. Normally, these should lead back to "Errors" sections in the documentation of those templates. However, if those templates use a module with <code>_labelledList()</code> and don't provide a <code>template</code> item in their options table, that error defaults to leading back here. The error can be solved by providing at least one valid page-name parameter to the template in question; the problem in the template can be fixed by providing some value to the <code>template</code> item of the <code>_labelledList()</code> <code>options</code> table.
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Hatnote modules| ]]
}}</includeonly>
7d283cc53e4db97f97b4fee7c83cd5b4cc64641b
Category:Masks
14
273
364
2023-11-10T14:31:44Z
Silentg
2
Created page with "A category of all the masks in the game."
wikitext
text/x-wiki
A category of all the masks in the game.
621c37240992f6048e76dc7afb82588061c3d8c5
368
364
2023-11-10T14:44:14Z
Silentg
2
wikitext
text/x-wiki
A category of all the [[Masks|masks]] in the game.
45c2436eed7690de02ab1dbb68165b4b554df8d4
Category:Page templates
14
274
365
2023-11-10T14:33:26Z
Silentg
2
Created page with "A category of templates used to help in the creation of copy-pasteable pages."
wikitext
text/x-wiki
A category of templates used to help in the creation of copy-pasteable pages.
4993ae228c94cee8befcf6b80d9c557c659abbb5
Skull Crest Mask
0
217
366
292
2023-11-10T14:35:08Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| name = Skull Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for mischief.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] North
| price = 400
| lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a human skull without the jaws. There are also glowing circular eyes.
| obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot.
* To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies.
* You can also reach it by advancing from [[Refinery Overlook]] normally.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Skull Crest Mask Icon.png |The In-game icon of the mask
Skull Crest Mask Location.png|The surrounding of the location of the mask
Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
*The skull has a resemblance to the common depiction of the skull emoji.
}}
5a54d1f70ea79d25ce3bd5c80ccce1d01aadac88
370
366
2023-11-10T14:47:43Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Skull Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for mischief.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] North
| price = 400
| lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a cartoonish depiction of the human skull without the jaws. There are also glowing circular eyes.
| obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot.
* To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies.
* You can also reach it by advancing from [[Refinery Overlook]] normally.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Skull Crest Mask Icon.png |The In-game icon of the mask
Skull Crest Mask Location.png|The surrounding of the location of the mask
Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
*The skull has a resemblance to the common depiction of the skull emoji.
}}
2aeb1d938675f1336cfebfa65d9865cc0b8dc18a
Template:Mask
10
192
367
346
2023-11-10T14:39:42Z
Silentg
2
type update
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Appearance==
{{{appearance|}}}
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Masks]]{{#switch:{{{type|}}}|normal=[[Category:Normal masks]]|challenge=[[Category:Challenge masks]]|seasonal=[[Category:Seasonal masks]]|misc=[[Category:Miscellaneous masks]]}}</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
2e6ece11ca82d4f3f224a173e8afd7041edcdbc6
Template:Mask/doc
10
200
369
266
2023-11-10T14:44:37Z
Silentg
2
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Masks|masks]].
== Usage ==
See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Mask
| type =
| name =
| description =
| location =
| price =
| lead =
| appearance =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; type
: The type of the mask. Only accepts these parameters: <tt>normal</tt>, <tt>challenge</tt>, <tt>seasonal</tt>, <tt>misc</tt>
; name
: The name of the mask.
; description
: The in-game description of the mask.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the mask.
; appearance
: Describe the mask's appearance as best as possible.
; obtain
: A bulleted list containing various methods to obtain the mask. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the mask. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the mask. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
bda0bf7cb12e5de22ba1f59cd19e3acf1ef29cdf
Category:Seasonal masks
14
275
371
2023-11-10T14:48:43Z
Silentg
2
Created page with "A category of all seasonal masks, masks that are only obtainable during a certain annual season or event. [[Category:Masks]]"
wikitext
text/x-wiki
A category of all seasonal masks, masks that are only obtainable during a certain annual season or event.
[[Category:Masks]]
9e3af3c6668037fc7872cc09e54f67e337c840ab
Jack O’ Lantern Crest Mask
0
191
372
271
2023-11-10T14:50:14Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Jack O’ Lantern Crest Mask
| description = A mask bearing a festive face that fills you with a fondness for sweets.
| location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]]
| price = 400
| lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes.
| obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]].
*To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it.
*You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate.
*You can fall down from the bridge before [[Witness Store]] to directly land on the item.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Jack O’ Lantern Crest Mask Icon.png|The In-game icon of the mask
Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask
Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
979753e63f966a8d0a67f71c8152a29aeb608527
Owl Crest Mask
0
196
373
273
2023-11-10T14:50:28Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Owl Crest Mask
| description = A mask with the face of a long-forgotten creature from the surface.
| location = [[The First Gate]]
| price = 400
| lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth.
| appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape.
| obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted.
*You can get there by simply dropping down from the East side of the bridge in [[The First Gate]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Owl Crest Mask Icon.png|The In-game icon of the mask
Owl Crest Mask Location.png|The surrounding of the location of the mask
Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
ce9f5b15066c1b3d8907281ab836ed48be98942c
Moonlight Pico Mask
0
201
374
274
2023-11-10T14:50:52Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Moonlight Pico Mask
| description = Bearing the visage of a werewolf-colored dragon, you feel scared just touching it.
| location = Near below [[Level 3 Ascent]]
| price = 400
| lead = The '''Moonlight Pico Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is one of the hardest mask to find among the 7 for the fact that it doesn't glow like the others.
| appearance = This mask has the shape of a brown-colored pico dragon from the game [https://cloudygamesllc.itch.io/dragon-drop Dragon Drop].
| obtain = *It is located behind a tree in an empty place under the "Wooden Branches" section in between [[Level 3 Ascent]] and [[Tower of Isolation]](On the East part of the map).
* To get to it, you can go to the "Wooden Branches" section and fall down from there, landing on the empty place where the mask lies.
* You can also teleport to [[Level 3 Ascent]] go Southeast and fall down to the zone there.
* You can also go from [[Bridge of Connection]] and fall down from there to the same place.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Moonlight Pico Mask Icon.png|The In-game icon of the mask
Moonlight Pico Mask Location.png|The surrounding of the location of the mask
Moonlight Pico Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This Mask's icon have a tint of light blue on it, while the actual mask is simply a brown pico mask.
*This Mask was initially intended to not be seasonal, however due to some certain players, it ended up being seasonal.
}}
fe28836f2ef0a7614c81241860f9047b8b53d13d
Ghost Crest Mask
0
205
375
278
2023-11-10T14:54:33Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Ghost Crest Mask
| description = A spooky mask featuring a spooky ghost. You try not to tremble with terror holding it.
| location = [[Floor 4 Beginning]]
| price = 400
| lead = The '''Ghost Crest Mask''' is one of the 7 Halloween masks released in October 2023. OOOooooOOoo SpO0okyyy...
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It's shapes resembles that of a ghost, but with small glowing eyes, making it rather...cute.
| obtain = *It is located right under the start of the conveyor belt going from [[Floor 4 Beginning]].
*To get it, go to [[Floor 4 Beginning]] and drop down at the direction of the conveyor belt(West).
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Ghost Crest Mask Icon.png|The In-game icon of the mask
Ghost Crest Mask Location.png|The surrounding of the location of the mask
Ghost Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
8d59650ac9891a5d802d73b91be67222870d8585
Creepy Smile Crest Mask
0
209
376
282
2023-11-10T14:55:17Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Creepy Smile Crest Mask
| description = A mask that only has an unnerving grin on it, wear it at your own risk.
| location = Above [[Bridge of Connection]]
| price = 400
| lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. The mask only have a stripped smile in the middle of it.
| obtain = *It is located right above the little roof above the checkpoint at [[Bridge of Connection]].
*You can reach it by simply going to [[Refinery Overlook]] and going in reverse(North) to fall down on the roof where the mask lies.
*You can also [[Techs|Double Jump Stack]] up with another player from [[Bridge of Connection]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Creepy Smile Crest Mask Icon.png|The In-game icon of the mask
Creepy Smile Crest Mask Location.png|The surrounding of the location of the mask
Creepy Smile Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
a63169d261b1a3123fc9565c0d02972fdb277ba1
Evil Eye Crest Mask
0
213
377
288
2023-11-10T14:55:47Z
Silentg
2
wikitext
text/x-wiki
{{Mask
| type = seasonal
| name = Evil Eye Crest Mask
| description = A mask with a single terrifying, it peers into your soul.
| location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest
| price = 400
| lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds.
| appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it.
| obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]].
*To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Evil Eye Crest Mask Icon.png|The In-game icon of the mask
Evil Eye Crest Mask Location.png|The surrounding of the location of the mask
Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This mask has no real significance to the lore despite its description.
}}
c99e51e2089f1153bd1c2e3933104738bfe5843b
MediaWiki:Sidebar
8
164
378
190
2023-11-12T15:45:42Z
Reduckilous
4
Adding the upload wizard page into the sidebar
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** Special:UploadWizard|Bulk Upload files
* SEARCH
* TOOLBOX
* LANGUAGES
9e2a58e1df746c6a6df2d3eb09f64b0a22565d87
Dyes
0
218
379
293
2023-11-24T13:39:05Z
Reduckilous
4
wikitext
text/x-wiki
== Normal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffb5b4" | [[Red Dye|Red]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#fdfff7" | [[Green Dye|Green]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#ffff07" | [[Yellow Dye|Yellow]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#e7feff" | [[Blue Dye|Blue]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#05ffff" | [[Cyan Dye|Cyan]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#ff02ff" | [[Purple Dye|Purple]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#fffdff" | [[Pink Dye|Pink]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#b702ff" | [[Violet Dye|Violet]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ffedf3" | [[Light Red Dye|Light Red]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#fdff05" | [[Lime Dye|Lime]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|}
== Seasonal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffe03c" | [[Orange Dye|Orange]]
|[[Sanctum Overlook]], next to the NPC with the same dye color.
|72
|Easy
|}
55b7c01a846f1f1f6ed9bbf22d438ea8195e0af2
Template:Dyes
10
276
380
2023-11-24T14:23:24Z
Reduckilous
4
Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = {{{minhex|}}} | label2 = Max Graphic Hex | data2 = {{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDI..."
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = Min Graphic Hex
| data1 = {{{minhex|}}}
| label2 = Max Graphic Hex
| data2 = {{{maxhex|}}}
| label3 = Location
| data3 = {{{location|}}}
| label4 = Price
| data4 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Dyes]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
2940e79cdc025f50fbdb3dc033dac504cb6911e5
383
380
2023-11-24T15:00:58Z
Reduckilous
4
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = Min Graphic Hex
| data1 = <nowiki>{{{minhex|}}}</nowiki>
| label2 = Max Graphic Hex
| data2 = <nowiki>{{{maxhex|}}}</nowiki>
| label3 = Location
| data3 = {{{location|}}}
| label4 = Price
| data4 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Dyes]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
472d85686633bc4e711bfa6c620f36eb1c0d2aff
384
383
2023-11-24T15:28:49Z
Reduckilous
4
Undo revision 383 by [[Special:Contributions/Reduckilous|Reduckilous]] ([[User talk:Reduckilous|talk]])
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = Min Graphic Hex
| data1 = {{{minhex|}}}
| label2 = Max Graphic Hex
| data2 = {{{maxhex|}}}
| label3 = Location
| data3 = {{{location|}}}
| label4 = Price
| data4 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Dyes]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
2940e79cdc025f50fbdb3dc033dac504cb6911e5
Template:Dyes/doc
10
277
381
2023-11-24T14:32:06Z
Reduckilous
4
Created page with "This template is used as a blueprint to create articles for [[Dyes|dyes]]. == Usage == See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Dyes | name = | minhex = | maxhex = | location = | price = | lead = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the dye. ; location : ; price : The price the player has to pay. ; le..."
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Dyes|dyes]].
== Usage ==
See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Dyes
| name =
| minhex =
| maxhex =
| location =
| price =
| lead =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; name
: The name of the dye.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the dye.
; obtain
: A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the dye. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
91fb0bc4e5d44f578848bbcd38c7322058af3c1c
385
381
2023-11-24T15:36:17Z
Reduckilous
4
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Dyes|dyes]].
== Usage ==
See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Dyes
| name =
| minhex =
| maxhex =
| location =
| price =
| lead =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; name
: The name of the dye.
; minhex
: The hex value of the color display when the game's graphic is put the minimum. Please use <nowiki><nowiki></nowiki> and <nowiki></nowiki></nowiki> to surround the hex code to avoid the tag turning into a numbered list.
; minhex
: The hex value of the color display when the game's graphic is put the maximum. Please use <nowiki><nowiki></nowiki> and <nowiki></nowiki></nowiki> to surround the hex code to avoid the tag turning into a numbered list.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the dye.
; obtain
: A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the dye. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
42b8df373c2059329334c0f3a0f3a078171adbef
Orange Dye
0
226
382
302
2023-11-24T14:47:07Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Orange Dye
| minhex = #3472AD
| maxhex = #ffe03c
| location = [[Sanctum Overlook]]
| price = 0
| lead = The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color.
| obtain =
*It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]].
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Orange Dye Bottle.png|The Dye Bottle
Orange Dye Showcase.png|Showcasing the Dye without accessories
Orange Dye Full Showcase.png|Showcasing the Dye with accessories
Orange Dye Witness.png|A Witness with the dye
Orange Dye Location.png|The Dye's location
</gallery>
| trivia = *The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released.
}}
b5e03c83a4ffa1325833796267e61b81b65f3ad3
386
382
2023-11-24T15:37:28Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Orange Dye
| minhex = <nowiki>#3472AD</nowiki>
| maxhex = <nowiki>#ffe03c</nowiki>
| location = [[Sanctum Overlook]]
| price = 0
| lead = The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color.
| obtain =
*It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]].
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Orange Dye Bottle.png|The Dye Bottle
Orange Dye Showcase.png|Showcasing the Dye without accessories
Orange Dye Full Showcase.png|Showcasing the Dye with accessories
Orange Dye Witness.png|A Witness with the dye
Orange Dye Location.png|The Dye's location
</gallery>
| trivia = *The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released.
}}
11e31fe7599e435f9d377e771715b254f18b9afc
File:Blue Dye Bottle.png
6
278
387
2023-11-24T17:06:30Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Blue Dye Bottle}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
e2e75483c72738d9a591b8874e72e614f26293e3
File:Blue Dye Showcase.png
6
279
388
2023-11-24T17:06:30Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Blue Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
418762ddd964684f28000135ec9fb10fb46c13bd
File:Blue Dye Full Showcase.png
6
280
389
2023-11-24T17:06:30Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Blue Dye Showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
26ce6330c16b925b09e1ef8e3ef22dd3e74c6979
File:Green Dye Bottle.png
6
281
390
2023-11-24T17:06:32Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Green Dye Showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
c85d4e71fe33a143bc99cc20249057cfeb00293a
File:Blue Dye.png
6
282
391
2023-11-24T17:06:34Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Blue Dye Showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
26ce6330c16b925b09e1ef8e3ef22dd3e74c6979
File:Green Dye Full Showcase.png
6
283
392
2023-11-24T17:06:34Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Green Dye Showcase.png
6
284
393
2023-11-24T17:06:36Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Green Dye.png
6
285
394
2023-11-24T17:06:36Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Red Dye Bottle.png
6
286
395
2023-11-24T17:06:38Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Red Dye Full Showcase.png
6
287
396
2023-11-24T17:06:42Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Red Dye Location.png
6
288
397
2023-11-24T17:06:42Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Red Dye Showcase.png
6
289
398
2023-11-24T17:06:42Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Yellow Dye Bottle.png
6
290
399
2023-11-24T17:06:48Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Red Dye.png
6
291
400
2023-11-24T17:06:49Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Yellow Dye Showcase.png
6
292
401
2023-11-24T17:06:56Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Yellow Dye.png
6
293
402
2023-11-24T17:06:56Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
File:Yellow Dye Full Showcase.png
6
294
403
2023-11-24T17:06:59Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Dye showcase}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
f124121e6210149b71c1ac7236effb5f8410af5f
Red Dye
0
295
404
2023-11-24T17:08:19Z
Reduckilous
4
Created page with "{{Dyes | name = Red Dye | minhex = <nowiki>#ff9797</nowiki> | maxhex = <nowiki>#ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|..."
wikitext
text/x-wiki
{{Dyes
| name = Red Dye
| minhex = <nowiki>#ff9797</nowiki>
| maxhex = <nowiki>#ffb5b4</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 0
| lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Red Dye Bottle.png|The Dye Bottle
Red Dye Showcase.png|Showcasing the Dye without accessories
Red Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
244c532274242a39379798f448db7d3105245b39
405
404
2023-11-24T17:11:54Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Red Dye
| minhex = <nowiki>#ff9797</nowiki>
| maxhex = <nowiki>#ffb5b4</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Red Dye Bottle.png|The Dye Bottle
Red Dye Showcase.png|Showcasing the Dye without accessories
Red Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
f69254abb8ebd2d255d07c3ea4504b75cb7b17f0
Green Dye
0
296
406
2023-11-24T17:12:03Z
Reduckilous
4
Created page with "{{Dyes | name = Green Dye | minhex = <nowiki>#faffef</nowiki> | maxhex = <nowiki>#fdfff7</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Green Dye Bottle.png|The Dye Bottle Green Dye Sho..."
wikitext
text/x-wiki
{{Dyes
| name = Green Dye
| minhex = <nowiki>#faffef</nowiki>
| maxhex = <nowiki>#fdfff7</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Green Dye Bottle.png|The Dye Bottle
Green Dye Showcase.png|Showcasing the Dye without accessories
Green Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
e4935c81e519fa74b474948a40669b5f620a41ee
Yellow Dye
0
297
407
2023-11-24T17:14:30Z
Reduckilous
4
Created page with "{{Dyes | name = Yellow Dye | minhex = <nowiki>#fffd02</nowiki> | maxhex = <nowiki>#ffff07</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Yellow Dye Bottle.png|The Dye Bottle Yellow Dye..."
wikitext
text/x-wiki
{{Dyes
| name = Yellow Dye
| minhex = <nowiki>#fffd02</nowiki>
| maxhex = <nowiki>#ffff07</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Yellow Dye Bottle.png|The Dye Bottle
Yellow Dye Showcase.png|Showcasing the Dye without accessories
Yellow Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
9e662fa5c9beeac89f01cba1dcd6896f4026226c
Blue Dye
0
298
408
2023-11-24T17:15:59Z
Reduckilous
4
Created page with "{{Dyes | name = Blue Dye | minhex = <nowiki>#ccfaff</nowiki> | maxhex = <nowiki>#e7feff</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Blue Dye Bottle.png|The Dye Bottle Blue Dye Showcas..."
wikitext
text/x-wiki
{{Dyes
| name = Blue Dye
| minhex = <nowiki>#ccfaff</nowiki>
| maxhex = <nowiki>#e7feff</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Blue Dye Bottle.png|The Dye Bottle
Blue Dye Showcase.png|Showcasing the Dye without accessories
Blue Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
909a9bdc3bd6074694ec2d8fcb71adb1fc7832fa
File:Deep Purple Dye Full Showcase.png
6
299
409
2023-11-25T13:22:56Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
421
409
2023-11-25T13:48:13Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Full Showcase.png]] to [[File:Deep Purple Dye Full Showcase.png]]: Misspelled title
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
File:Deep Purple Dye Bottle.png
6
300
410
2023-11-25T13:22:56Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
423
410
2023-11-25T13:48:22Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Bottle.png]] to [[File:Deep Purple Dye Bottle.png]]: Misspelled title
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
File:Deep Purple Dye Location.png
6
301
411
2023-11-25T13:22:57Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
419
411
2023-11-25T13:48:05Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Location.png]] to [[File:Deep Purple Dye Location.png]]: Misspelled title
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
File:Deep Purple Dye Showcase.png
6
302
412
2023-11-25T13:23:01Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
415
412
2023-11-25T13:47:08Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Showcase.png]] to [[File:Deep Purple Dye Showcase.png]]
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
File:Deep Purple Dye.png
6
303
413
2023-11-25T13:23:02Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
417
413
2023-11-25T13:47:56Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple.png]] to [[File:Deep Purple Dye.png]]: Misspelled title
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Image for the Dyes}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
3200fd08b7d967a78f6814853006205d9f117423
Dyes
0
218
414
379
2023-11-25T13:39:57Z
Reduckilous
4
adding purple
wikitext
text/x-wiki
== Normal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffb5b4" | [[Red Dye|Red]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#fdfff7" | [[Green Dye|Green]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#ffff07" | [[Yellow Dye|Yellow]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#e7feff" | [[Blue Dye|Blue]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#05ffff" | [[Cyan Dye|Cyan]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#ff02ff" | [[Purple Dye|Purple]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#fffdff" | [[Pink Dye|Pink]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#b702ff" | [[Violet Dye|Violet]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ffedf3" | [[Light Red Dye|Light Red]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#fdff05" | [[Lime Dye|Lime]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]]
|Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]]
|0
|Medium
|}
== Seasonal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffe03c" | [[Orange Dye|Orange]]
|[[Sanctum Overlook]], next to the NPC with the same dye color.
|72
|Easy
|}
2621adfbaa0c979279e149929a11df7de47ddbf2
File:Deep Purple Showcase.png
6
304
416
2023-11-25T13:47:08Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Showcase.png]] to [[File:Deep Purple Dye Showcase.png]]
wikitext
text/x-wiki
#REDIRECT [[File:Deep Purple Dye Showcase.png]]
4032c2e02fc49d35c800a17e7ef0e85cc3d82058
File:Deep Purple.png
6
305
418
2023-11-25T13:47:56Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple.png]] to [[File:Deep Purple Dye.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Deep Purple Dye.png]]
8aa5443661f288a5b3622e1b7ed68c7a00027e45
File:Deep Purple Location.png
6
306
420
2023-11-25T13:48:05Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Location.png]] to [[File:Deep Purple Dye Location.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Deep Purple Dye Location.png]]
b2f2cacebd8d800d2faa3b4803d216a0264863b8
File:Deep Purple Full Showcase.png
6
307
422
2023-11-25T13:48:13Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Full Showcase.png]] to [[File:Deep Purple Dye Full Showcase.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Deep Purple Dye Full Showcase.png]]
089bff975325fca4b4f6066e6e6d93e091530c9a
File:Deep Purple Bottle.png
6
308
424
2023-11-25T13:48:22Z
Reduckilous
4
Reduckilous moved page [[File:Deep Purple Bottle.png]] to [[File:Deep Purple Dye Bottle.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Deep Purple Dye Bottle.png]]
554a4f766348fc66ffe4c629195de8100b083449
Deep Purple Dye
0
309
425
2023-11-25T13:49:29Z
Reduckilous
4
Created page with "{{Dyes | name = Deep Purple Dye | minhex = <nowiki>#6301d5</nowiki> | maxhex = <nowiki>#6300d5</nowiki> | location = [[Abyssal Sanctum Market]] | price = 800 | lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn. | obtain = *It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]]. | gallery = <gallery style="background-color:#0B2347; width:53%;..."
wikitext
text/x-wiki
{{Dyes
| name = Deep Purple Dye
| minhex = <nowiki>#6301d5</nowiki>
| maxhex = <nowiki>#6300d5</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 800
| lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn.
| obtain =
*It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]].
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Deep Purple Dye Bottle.png|The Dye Bottle
Deep Purple Dye Showcase.png|Showcasing the Dye without accessories
Deep Purple Dye Full Showcase.png|Showcasing the Dye with accessories
Deep Purple Dye Location.png|The Dye's location
</gallery>
}}
a5c6c84613a4cd3dc682b71bf3107a1af9f2e4ed
Category:Wings
14
310
426
2023-11-25T14:01:14Z
Reduckilous
4
Created page with "Category of all [[Wings]] in the game."
wikitext
text/x-wiki
Category of all [[Wings]] in the game.
9b824a5fcfc56972abb393ce4c10cda27c461cc9
Template:Wings
10
311
427
2023-11-25T14:14:14Z
Reduckilous
4
Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}}..."
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = In-Game Description
| data1 = {{{description|}}}
| label2 = Location
| data2 = {{{location|}}}
| label3 = Price
| data3 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Appearance==
{{{appearance|}}}
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Wings]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
0b2d4277a34d5804d4401fdac7a9ce99ab334eb3
Template:Wings/doc
10
312
428
2023-11-25T14:21:12Z
Reduckilous
4
Created page with "This template is used as a blueprint to create articles for [[Wings|wings]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Wing | type = | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the wing. ; description : The in-game description of..."
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Wings|wings]].
== Usage ==
See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Wing
| type =
| name =
| description =
| location =
| price =
| lead =
| appearance =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; name
: The name of the wing.
; description
: The in-game description of the wing.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the wing.
; appearance
: Describe the wing's appearance as best as possible.
; obtain
: A bulleted list containing various methods to obtain the wing. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the wing. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the wing. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
957b4fcfb22ed1d52bee1282dbbbcc513a5b2594
File:Large Ring Wing.png
6
313
429
2023-11-25T16:36:00Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Void Cape.png
6
314
430
2023-11-25T16:36:00Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Guardian Wings.png
6
315
431
2023-11-25T16:36:01Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Megaannum Wings.png
6
316
432
2023-11-25T16:36:04Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Tulip Wing.png
6
317
433
2023-11-25T16:36:05Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Bee Wings.png
6
318
434
2023-11-25T16:36:05Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Souldeer Wings.png
6
319
435
2023-11-25T16:36:07Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Nix's Wings.png
6
320
436
2023-11-25T16:36:07Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Neon Whale.png
6
321
437
2023-11-25T16:36:09Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Warped Wings.png
6
322
438
2023-11-25T16:36:14Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Wings of the Fallen.png
6
323
439
2023-11-25T16:36:14Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Lilith's Wings.png
6
324
440
2023-11-25T16:36:16Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Runic Wings.png
6
325
441
2023-11-25T16:36:21Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
449
441
2023-11-26T08:02:59Z
Reduckilous
4
Reduckilous moved page [[File:Runic's Wings.png]] to [[File:Runic Wings.png]]: Misspelled title
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Wings of Possession.png
6
326
442
2023-11-25T16:36:21Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Glider Wing.png
6
327
443
2023-11-25T16:36:25Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Rei's Wing.png
6
328
444
2023-11-25T16:36:28Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Scaled Shell.png
6
329
445
2023-11-25T16:36:29Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Cape Wing Blue.png
6
330
446
2023-11-25T16:36:32Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
File:Abital's Wings.png
6
331
447
2023-11-25T16:36:35Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Abyssal wing}}
|date=2023-11-25
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
9764ecab596fd2c7d3a6daab547931d829960ff3
Wings
0
332
448
2023-11-25T18:33:17Z
Reduckilous
4
Created page with "{{See also|Masks|Dyes}} Wings are one of the three main cosmetics in the game. ==Normal Wings== Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B234..."
wikitext
text/x-wiki
{{See also|Masks|Dyes}}
Wings are one of the three main cosmetics in the game.
==Normal Wings==
Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Glider Wing]]
| [[File:Glider Wing.png|100px|link=[[Glider Wing]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Tulip Wing]]
| [[File:Tulip Wing.png|100px|link=[[Tulip Wing]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Nix's Wings]]
| [[File:Nix's Wings.png|100px|link=[[Nix's Wings]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Warped Wings]]
| [[File:Warped Wings.png|100px|link=[[Warped Wings]]]]
|
* Located behind a big broken pillar on the East of the map, ground floor.
|0
|Medium
|-
| [[Megaannum Wings]]
| [[File:Megaannum Wings.png|100px|link=[[Megaannum Wings]]]]
|
* Located at the end of the "Orb vault" in the South of [[Plinko Overlook]].
|324
|Easy
|-
| [[Large Ring Wing]]
| [[File:Large Ring Wing.png|100px|link=[[Large Ring Wing]]]]
|
* Located under the small parkour section North of [[Witness Store]] which can be directly dropped down into.
|247
|Easy
|-
| [[Lilith's Wings]]
| [[File:Lilith's Wings.png|100px|link=[[Lilith's Wings]]]]
|
* Located near under the [[Witness Store]] and behind a pillar.
* Can be obtained by going East from [[Witness Store]] and drop down to the support beams section far above [[Sanctum Overlook]].
|196
|Medium
|-
| [[Scaled Shell]]
| [[File:Scaled Shell.png|100px|link=[[Scaled Shell]]]]
|
* Located in the center of 4 pillars, on the West from under the bridge before [[The Second Gate]].
|321
|Easy
|-
| [[Wings of the Fallen]]
| [[File:Wings of the Fallen.png|100px|link=[[Wings of the Fallen]]]]
|
* Located in a small hall way next to a room with an echo, on the upper Southeast from [[Witness Store]].
* Can be quickly obtained from dropping down from the West of [[Floor 4 Beginning]]
|341
|Medium
|-
| [[Bee Wings]]
| [[File:Bee Wings.png|100px|link=[[Bee Wings]]]]
|
* Located on top of the tower on the North from [[Beginner's Grotto]]
* Can be obtained by going South from [[Level 3 Ascent]] and then dropping down to the top of tower where the mask lies.
|203
|Easy
|-
| [[Guardian Wings]]
| [[File:Guardian Wings.png|100px|link=[[Guardian Wings]]]]
|
* Located on a broken bridge, East from the tower on the North from [[Beginner's Grotto]]
* Can be obtained by going Southeast from [[Level 3 Ascent]] and then dropping down to the hridge where the mask lies.
|156
|Easy
|-
| [[Void Cape]]
| [[File:Void Cape.png|100px|link=[[Void Cape]]]]
|
* Located Northwest and below from [[Level 3 Ascent]]
|410
|Easy
|-
| [[Souldeer Wings]]
| [[File:Souldeer Wings.png|100px|link=[[Souldeer Wings]]]]
|
* Located below the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]].
* Can be quickly obtained by dropping from [[Floor 4 Beginning]].
|370
|Medium
|-
| [[Wings of Possession]]
| [[File:Wings of Possession.png|100px|link=[[Wings of Possession]]]]
|
* Located behind a pillar in Southeast of [[Refinery Overlook]].
|1052
|Easy
|}
==Miscellaneous Wings==
Miscellaneous wings includes all the other wings that do not fit into any of the above sections. They include purchasable wings, wings obtained from loyalty rewards, and promotional wings.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Neon Whale]]
| [[File:Neon Whale.png|100px|link=[[Neon Whale]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2128751729/Alpha-Player Alpha Player] badge from the game [https://www.roblox.com/games/10915082890/Whale-Survival Whale Survival].
|-
| [[Cape Wing Blue]]
| [[File:Cape Wing Blue.png|100px|link=[[Cape Wing Blue]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set].
|-
| [[Rei's Wing]]
| [[File:Rei's Wing.png|100px|link=[[Rei's Wing]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set].
|-
| [[Abital's Wings]]
| [[File:Abital's Wings.png|100px|link=[[Abital's Wings]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set].
}
b601f205327cd0e17653afdf2c15adda8aeeb51b
451
448
2023-11-26T08:03:45Z
Reduckilous
4
i forgo to add the runic wing
wikitext
text/x-wiki
{{See also|Masks|Dyes}}
Wings are one of the three main cosmetics in the game.
==Normal Wings==
Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[Glider Wing]]
| [[File:Glider Wing.png|100px|link=[[Glider Wing]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Tulip Wing]]
| [[File:Tulip Wing.png|100px|link=[[Tulip Wing]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Nix's Wings]]
| [[File:Nix's Wings.png|100px|link=[[Nix's Wings]]]]
|
* Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there.
|0
|Easy
|-
| [[Warped Wings]]
| [[File:Warped Wings.png|100px|link=[[Warped Wings]]]]
|
* Located behind a big broken pillar on the East of the map, ground floor.
|0
|Medium
|-
| [[Megaannum Wings]]
| [[File:Megaannum Wings.png|100px|link=[[Megaannum Wings]]]]
|
* Located at the end of the "Orb vault" in the South of [[Plinko Overlook]].
|324
|Easy
|-
| [[Large Ring Wing]]
| [[File:Large Ring Wing.png|100px|link=[[Large Ring Wing]]]]
|
* Located under the small parkour section North of [[Witness Store]] which can be directly dropped down into.
|247
|Easy
|-
| [[Lilith's Wings]]
| [[File:Lilith's Wings.png|100px|link=[[Lilith's Wings]]]]
|
* Located near under the [[Witness Store]] and behind a pillar.
* Can be obtained by going East from [[Witness Store]] and drop down to the support beams section far above [[Sanctum Overlook]].
|196
|Medium
|-
| [[Scaled Shell]]
| [[File:Scaled Shell.png|100px|link=[[Scaled Shell]]]]
|
* Located in the center of 4 pillars, on the West from under the bridge before [[The Second Gate]].
|321
|Easy
|-
| [[Wings of the Fallen]]
| [[File:Wings of the Fallen.png|100px|link=[[Wings of the Fallen]]]]
|
* Located in a small hall way next to a room with an echo, on the upper Southeast from [[Witness Store]].
* Can be quickly obtained from dropping down from the West of [[Floor 4 Beginning]]
|341
|Medium
|-
| [[Bee Wings]]
| [[File:Bee Wings.png|100px|link=[[Bee Wings]]]]
|
* Located on top of the tower on the North from [[Beginner's Grotto]]
* Can be obtained by going South from [[Level 3 Ascent]] and then dropping down to the top of tower where the mask lies.
|203
|Easy
|-
| [[Guardian Wings]]
| [[File:Guardian Wings.png|100px|link=[[Guardian Wings]]]]
|
* Located on a broken bridge, East from the tower on the North from [[Beginner's Grotto]]
* Can be obtained by going Southeast from [[Level 3 Ascent]] and then dropping down to the hridge where the mask lies.
|156
|Easy
|-
| [[Void Cape]]
| [[File:Void Cape.png|100px|link=[[Void Cape]]]]
|
* Located Northwest and below from [[Level 3 Ascent]]
|410
|Easy
|-
| [[Souldeer Wings]]
| [[File:Souldeer Wings.png|100px|link=[[Souldeer Wings]]]]
|
* Located below the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]].
* Can be quickly obtained by dropping from [[Floor 4 Beginning]].
|370
|Medium
|-
| [[Wings of Possession]]
| [[File:Wings of Possession.png|100px|link=[[Wings of Possession]]]]
|
* Located behind a pillar in Southeast of [[Refinery Overlook]].
|1052
|Easy
|}
==Miscellaneous Wings==
Miscellaneous wings includes all the other wings that do not fit into any of the above sections. They include purchasable wings, wings obtained from loyalty rewards, and promotional wings.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:13%" scope="col"| Name
!style="background-color:#3472AD; Width:12%" scope="col"| Appearance
!style="background-color:#3472AD" scope="col" |Obtainment
|-
| [[Neon Whale]]
| [[File:Neon Whale.png|100px|link=[[Neon Whale]]]]
| Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2128751729/Alpha-Player Alpha Player] badge from the game [https://www.roblox.com/games/10915082890/Whale-Survival Whale Survival].
|-
| [[Cape Wing Blue]]
| [[File:Cape Wing Blue.png|100px|link=[[Cape Wing Blue]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set].
|-
| [[Rei's Wing]]
| [[File:Rei's Wing.png|100px|link=[[Rei's Wing]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set].
|-
| [[Abital's Wings]]
| [[File:Abital's Wings.png|100px|link=[[Abital's Wings]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set].
|-
| [[Runic Wings]]
| [[File:Runic Wings.png|100px|link=[[Runic Wings]]]]
| Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set].
}
3c8e585d5c277cb88e0db4eeae52c753f4889994
File:Runic's Wings.png
6
333
450
2023-11-26T08:03:00Z
Reduckilous
4
Reduckilous moved page [[File:Runic's Wings.png]] to [[File:Runic Wings.png]]: Misspelled title
wikitext
text/x-wiki
#REDIRECT [[File:Runic Wings.png]]
76ebb22c2c5d3836b65045ea31fe4d6d26a4dd8b
Dyes
0
218
452
414
2023-11-26T08:05:53Z
Reduckilous
4
see also
wikitext
text/x-wiki
{{See also|Wings|Masks}}
== Normal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffb5b4" | [[Red Dye|Red]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#fdfff7" | [[Green Dye|Green]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#ffff07" | [[Yellow Dye|Yellow]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#e7feff" | [[Blue Dye|Blue]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#05ffff" | [[Cyan Dye|Cyan]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#ff02ff" | [[Purple Dye|Purple]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#fffdff" | [[Pink Dye|Pink]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#b702ff" | [[Violet Dye|Violet]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ffedf3" | [[Light Red Dye|Light Red]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#fdff05" | [[Lime Dye|Lime]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]]
|Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]]
|0
|Medium
|}
== Seasonal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffe03c" | [[Orange Dye|Orange]]
|[[Sanctum Overlook]], next to the NPC with the same dye color.
|72
|Easy
|}
b18caa6080b14f9760c6705958812aabe36e162a
453
452
2023-11-26T08:51:06Z
Reduckilous
4
Notice
wikitext
text/x-wiki
{{See also|Wings|Masks}}
Note: All Dye names used on this page are '''subject to change''' and are currently referred with community made names.
== Normal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffb5b4" | [[Red Dye|Red]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#fdfff7" | [[Green Dye|Green]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#ffff07" | [[Yellow Dye|Yellow]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#e7feff" | [[Blue Dye|Blue]]
|Located in the Dye Store in [[Abyssal Sanctum Market]]
|8
|Easy
|-
|style="background-color:#05ffff" | [[Cyan Dye|Cyan]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#ff02ff" | [[Purple Dye|Purple]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#fffdff" | [[Pink Dye|Pink]]
|Located in the Dye Store in [[Level 2 Ascent]]
|168
|Easy
|-
|style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#b702ff" | [[Violet Dye|Violet]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]]
|Located in the Dye Store in [[Level 3 Ascent]]
|457
|Easy
|-
|style="background-color:#ffedf3" | [[Light Red Dye|Light Red]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#fdff05" | [[Lime Dye|Lime]]
|Located in the Dye Store in [[Floor 4 Beginning]]
|824
|Easy
|-
|style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]]
|Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]]
|0
|Medium
|}
== Seasonal Dyes ==
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:20%" scope="col"| Color
!style="background-color:#3472AD" scope="col" |Location
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
|style="background-color:#ffe03c" | [[Orange Dye|Orange]]
|[[Sanctum Overlook]], next to the NPC with the same dye color.
|72
|Easy
|}
c24b7f6b8b5d020b95e3357f52952f32492c09c4
File:Large Ring Wing Showcase.png
6
334
454
2023-11-26T09:19:11Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Nix's Wings Icon.png
6
335
455
2023-11-26T09:19:11Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Nix's Wings Showcase.png
6
336
456
2023-11-26T09:19:14Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Tulip Wing Icon.png
6
337
457
2023-11-26T09:19:15Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Tulip Wing Showcase.png
6
338
458
2023-11-26T09:19:15Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Warped Wings Icon.png
6
339
459
2023-11-26T09:19:20Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Warped Wings Location.png
6
340
460
2023-11-26T09:19:22Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Warped Wings Showcase.png
6
341
461
2023-11-26T09:19:25Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Glider Wing Icon.png
6
342
462
2023-11-26T09:19:27Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Glider Wing Location.png
6
343
463
2023-11-26T09:19:28Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Glider Wing Showcase.png
6
344
464
2023-11-26T09:19:32Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Large Ring Wing Icon.png
6
345
465
2023-11-26T09:19:35Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
File:Large Ring Wing Location.png
6
346
466
2023-11-26T09:19:36Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=Wings images for gallery}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
ecacf85947ab111070203b4ba92f551f859d1746
Glider Wing
0
347
467
2023-11-26T09:24:28Z
Reduckilous
4
Created page with "{{Wings | name = Glider Wing | description = A wing designed to glide through the air. It's unfortunately not very effective though. | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries. | appearance = The wing resembles a real life Hang Glider but are much smaller and have..."
wikitext
text/x-wiki
{{Wings
| name = Glider Wing
| description = A wing designed to glide through the air. It's unfortunately not very effective though.
| location = [[Abyssal Sanctum Market]]
| price = 0
| lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries.
| appearance = The wing resembles a real life Hang Glider but are much smaller and have a steep curve instead.
| obtain =
*Buy it in the Market in [[Abyssal Sanctum Market]]
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Glider Wing Icon.png|The In-game icon of the mask
Glider Wing Location.png|The surrounding of the location of the mask
Glider Wing Showcase.png|Showcasing an Abyssal Walker wearing the mask
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
}}
7e830a369d781993daab0749e7b032e3bbfb924b
468
467
2023-11-26T09:29:28Z
Reduckilous
4
typo woopsies.
wikitext
text/x-wiki
{{Wings
| name = Glider Wing
| description = A wing designed to glide through the air. It's unfortunately not very effective though.
| location = [[Abyssal Sanctum Market]]
| price = 0
| lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries.
| appearance = The wing resembles a real life Hang Glider but are much smaller and have a steep curve instead.
| obtain =
*Buy it in the Market in [[Abyssal Sanctum Market]]
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Glider Wing Icon.png|The In-game icon of the wing
Glider Wing Location.png|The surrounding of the location of the wing
Glider Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
}}
125472133db866e7847fcb4874c23d10c3381905
Tulip Wing
0
348
469
2023-11-26T09:30:42Z
Reduckilous
4
Created page with "{{Wings | name = Tulip Wing | description = Wings crafted from the petals of a tulip, harvested at the peak of their brilliance. | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The '''Tulip Wing''' is one of the wings sold in the Market. | appearance = The wing resemble an upside down Tulip when they bloom. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347;..."
wikitext
text/x-wiki
{{Wings
| name = Tulip Wing
| description = Wings crafted from the petals of a tulip, harvested at the peak of their brilliance.
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The '''Tulip Wing''' is one of the wings sold in the Market.
| appearance = The wing resemble an upside down Tulip when they bloom.
| obtain =
*Buy it in the Market in [[Abyssal Sanctum Market]]
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Tulip Wing Icon.png|The In-game icon of the wing
Glider Wing Location.png|The surrounding of the location of the wing
Tulip Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
}}
8b055dbc960a8e0229b242583a1478ace2365274
Nix's Wings
0
349
470
2023-11-26T09:42:50Z
Reduckilous
4
Created page with "{{Wings | name = Nix's Wings | description = Wings worn by the fabled warrior Nix. The material is from a sacred place long forgotten. | location = [[Abyssal Sanctum Market]] | price = 1000 | lead = The '''Nix's Wings''' is the most expensive wings sold in the Market. | appearance = The wing are 3 diamond shaped, shard like, wings attached together. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]]. | gallery = <gallery sty..."
wikitext
text/x-wiki
{{Wings
| name = Nix's Wings
| description = Wings worn by the fabled warrior Nix. The material is from a sacred place long forgotten.
| location = [[Abyssal Sanctum Market]]
| price = 1000
| lead = The '''Nix's Wings''' is the most expensive wings sold in the Market.
| appearance = The wing are 3 diamond shaped, shard like, wings attached together.
| obtain =
*Buy it in the Market in [[Abyssal Sanctum Market]].
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Nix's Wings Icon.png|The In-game icon of the wing
Glider Wing Location.png|The surrounding of the location of the wing
Nix's Wings Showcase.png|Showcasing an Abyssal Walker wearing the wing
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
*This is the only wing in the game that have 3 wings.
}}
e6bbb4a131332e4cdb89ddc147202d8ba1010f68
Warped Wings
0
350
471
2023-11-26T10:01:33Z
Reduckilous
4
Created page with "{{Wings | name = Warped Wings | description = Wings warped from the immense pressure of the abyss. | location = [[Beginner's Grotto]] | price = 400 | lead = The '''Warped Wings''' gives off a mysterious vibe, which is why many player seems to love it. | appearance = The wings appears as 2 spirals, with the one on the left spiral in counter clockwise, while the right one spiral closewise. However, the spirals are not clearly visualized as it is all..."
wikitext
text/x-wiki
{{Wings
| name = Warped Wings
| description = Wings warped from the immense pressure of the abyss.
| location = [[Beginner's Grotto]]
| price = 400
| lead = The '''Warped Wings''' gives off a mysterious vibe, which is why many player seems to love it.
| appearance = The wings appears as 2 spirals, with the one on the left spiral in counter clockwise, while the right one spiral closewise. However, the spirals are not clearly visualized as it is all neon.
| obtain =
*It is located in the very East on ground floor and behind a big broken pillar. It is also far behind the 20 Echoes required '''room''' aswell.
*You can get to the wing by going East from [[Beginner's Grotto]] to the very end of the map, and then look for pillars around there and you should be able to spot the wing quite easily.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Warped Wings Icon.png|The In-game icon of the wing
Warped Wings Location.png|The surrounding of the location of the wing
Warped Wings Showcase.png|Showcasing an Abyssal Walker wearing the wing
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
*Different from it's Journey to the Sun counter part - Spiral Wings; this wing are not warped from the cruel votes of Votedown.
}}
c6b74cd0bd1036c052c882dce3f91349e52b1642
Large Ring Wing
0
351
472
2023-11-26T10:11:53Z
Reduckilous
4
Created page with "{{Wings | name = Large Ring Wing | description = Similar to the ring wings of the Abyssals, but larger. Where could it have come from? | location = [[Witness Store]] | price = 400 | lead = The Large Ring Wing is simple bigger version of the default wing of the player. | appearance = The wing is a big circle, and resembles a large version of an angel's halo. | obtain = *It is located in between 2 horizontal support beam below the North of ..."
wikitext
text/x-wiki
{{Wings
| name = Large Ring Wing
| description = Similar to the ring wings of the Abyssals, but larger. Where could it have come from?
| location = [[Witness Store]]
| price = 400
| lead = The Large Ring Wing is simple bigger version of the default wing of the player.
| appearance = The wing is a big circle, and resembles a large version of an angel's halo.
| obtain =
*It is located in between 2 horizontal support beam below the North of [[Witness Store]].
*It can be obtained by following the mini parkour section on the East of [[Witness Store]] that begins with a ladder.
*It can be also obtained by falling down from the parkour section that comes after [[Witness Store]] into between the 2 beams, where the wing lies.
| gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Large Ring Wing Icon.png|The In-game icon of the wing
Large Ring Wing Location.png|The surrounding of the location of the wing
Large Ring Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing
</gallery>
| trivia = *This wing have the same model as the ones in Journey to the sun.
}}
82eb56a7ba2f94002bb924a96a7d7addf35761bf
Echoes
0
352
473
2023-11-26T14:57:32Z
Reduckilous
4
W.I.P
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:12%" scope="col" | Surrounding
!style="background-color:#3472AD" scope="col" | Location
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| [[1]]
| [[File:Placeholder.png|100px]]
|
* placeholder
bb17701bdfcc6fdb54ff9d4416db68a978a51e2f
File:153m Echo.png
6
354
474
2023-11-26T16:57:21Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:126m Echo.png
6
355
475
2023-11-26T16:57:21Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:136m Echo.png
6
353
476
2023-11-26T16:57:21Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:168m Echo.png
6
356
477
2023-11-26T16:57:29Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:286m Echo.png
6
357
478
2023-11-26T16:57:30Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:311m Echo.png
6
358
479
2023-11-26T16:57:30Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:362m Echo.png
6
359
480
2023-11-26T16:57:38Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:339m Echo.png
6
360
481
2023-11-26T16:57:38Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:411m Echo.png
6
361
482
2023-11-26T16:57:40Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:426m Echo.png
6
362
483
2023-11-26T16:57:46Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:498m Echo.png
6
363
484
2023-11-26T16:57:46Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:583m Echo.png
6
364
485
2023-11-26T16:57:51Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:597m Echo.png
6
365
486
2023-11-26T16:57:57Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:823m Echo.png
6
366
487
2023-11-26T16:57:58Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:939m Echo.png
6
367
488
2023-11-26T16:58:01Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:951m Echo.png
6
368
489
2023-11-26T16:58:06Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:1007m Echo.png
6
369
490
2023-11-26T16:58:06Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:1142m Echo.png
6
370
491
2023-11-26T16:58:12Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:1m Echo.png
6
371
492
2023-11-26T16:58:14Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:1231m Echo.png
6
372
493
2023-11-26T16:58:17Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:23m Echo.png
6
373
494
2023-11-26T16:58:20Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:40m Echo.png
6
374
495
2023-11-26T16:59:48Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:63m Echo.png
6
375
496
2023-11-26T16:59:50Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:24m Echo.png
6
376
497
2023-11-26T16:59:50Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
File:95m Echo.png
6
377
498
2023-11-26T16:59:52Z
Reduckilous
4
Uploaded own work with UploadWizard
wikitext
text/x-wiki
=={{int:filedesc}}==
{{Information
|description={{lua|1=For the echoes page}}
|date=2023-11-26
|source={{own}}
|author=[[User:Reduckilous|Reduckilous]]
|permission=
|other versions=
}}
=={{int:license-header}}==
{{self|cc-by-sa-4.0}}
dd9ec31e0f24d9658ec2163cd8781f56493889d6
Red Dye
0
295
499
405
2023-11-27T06:30:51Z
Reduckilous
4
added minor info-Reducki from school
wikitext
text/x-wiki
{{Dyes
| name = Red Dye
| minhex = <nowiki>#ff9797</nowiki>
| maxhex = <nowiki>#ffb5b4</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Red Dye Bottle.png|The Dye Bottle
Red Dye Showcase.png|Showcasing the Dye without accessories
Red Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
9a0d8d97fe111d4795f1fd7c805b1e44726c9c09
Blue Dye
0
298
500
408
2023-11-27T06:31:32Z
Reduckilous
4
minor detail added
wikitext
text/x-wiki
{{Dyes
| name = Blue Dye
| minhex = <nowiki>#ccfaff</nowiki>
| maxhex = <nowiki>#e7feff</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Blue Dye Bottle.png|The Dye Bottle
Blue Dye Showcase.png|Showcasing the Dye without accessories
Blue Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
a2b55f3a3e71ea91b78c223b228fbbe38c255088
Yellow Dye
0
297
501
407
2023-11-27T06:32:26Z
Reduckilous
4
Minor adjustment - Reduck from school
wikitext
text/x-wiki
{{Dyes
| name = Yellow Dye
| minhex = <nowiki>#fffd02</nowiki>
| maxhex = <nowiki>#ffff07</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Yellow Dye Bottle.png|The Dye Bottle
Yellow Dye Showcase.png|Showcasing the Dye without accessories
Yellow Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
1a1fd4adafbc0dd9684a538d69eda9fe27953cb5
Green Dye
0
296
502
406
2023-11-27T06:33:13Z
Reduckilous
4
minor stuff
wikitext
text/x-wiki
{{Dyes
| name = Green Dye
| minhex = <nowiki>#faffef</nowiki>
| maxhex = <nowiki>#fdfff7</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Green Dye Bottle.png|The Dye Bottle
Green Dye Showcase.png|Showcasing the Dye without accessories
Green Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
4df236efdffa88c1176b220db47fcfc968537b9f
514
502
2023-11-27T15:58:07Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Green Dye
| minhex = <nowiki>faffef</nowiki>
| maxhex = <nowiki>fdfff7</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Green Dye Bottle.png|The Dye Bottle
Green Dye Showcase.png|Showcasing the Dye without accessories
Green Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
1603893606829f10c27d3289543008fdeef58585
File:Abyssal favicon.png
6
378
503
2023-11-27T11:45:25Z
Reduckilous
4
For the wiki's favicon.
wikitext
text/x-wiki
== Summary ==
For the wiki's favicon.
b7a4479d8a1dc76b660d7730d61139dc96a92201
File:Abyssal Icon New.svg
6
381
506
2023-11-27T13:34:34Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
507
506
2023-11-27T13:36:41Z
Reduckilous
4
Reduckilous uploaded a new version of [[File:Abyssal Icon New.svg]]
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Abyssal Wordmark.svg
6
382
508
2023-11-27T13:37:57Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
509
508
2023-11-27T13:56:37Z
Reduckilous
4
Reduckilous uploaded a new version of [[File:Abyssal Wordmark.svg]]
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
File:Favicon.ico
6
383
510
2023-11-27T15:40:13Z
Reduckilous
4
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Template:Dyes
10
276
511
384
2023-11-27T15:56:00Z
Reduckilous
4
adding the tag beforehand
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = Min Graphic Hex
| data1 = # {{{minhex|}}}
| label2 = Max Graphic Hex
| data2 = # {{{maxhex|}}}
| label3 = Location
| data3 = {{{location|}}}
| label4 = Price
| data4 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Dyes]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
b0ee24e5fa8773f523c478b4fbe6994da6ef972b
518
511
2023-11-27T15:59:24Z
Reduckilous
4
removing the space
wikitext
text/x-wiki
<includeonly>{{Infobox
| bodystyle = background-color:#0B2347; color: #FFFFF5
| abovestyle = background-color:#3472AD; font-size:20px; padding:7px
| above = {{{name|}}}
| image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]]
| label1 = Min Graphic Hex
| data1 = #{{{minhex|}}}
| label2 = Max Graphic Hex
| data2 = #{{{maxhex|}}}
| label3 = Location
| data3 = {{{location|}}}
| label4 = Price
| data4 = {{{price|0}}} AE
}}
{{{lead|}}}
__NOEDITSECTION__
==Obtainment==
{{{obtain|}}}
{{#if:{{{gallery|}}}|<h2>Gallery</h2>
{{{gallery|}}}|}}
{{#if:{{{trivia|}}}|<h2>Trivia</h2>
{{{trivia|}}}|}}
{{#if:{{{refs|}}}|<h2>References</h2>
<references/>|}}
[[Category:Dyes]]</includeonly><noinclude>
{{Documentation}}
[[Category:Page templates]]
</noinclude>
e7f33132feebe1fc0bfce410969f2206e5e4701b
Template:Dyes/doc
10
277
512
385
2023-11-27T15:57:08Z
Reduckilous
4
adjusting the guideline
wikitext
text/x-wiki
This template is used as a blueprint to create articles for [[Dyes|dyes]].
== Usage ==
See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter.
<pre>
{{Dyes
| name =
| minhex =
| maxhex =
| location =
| price =
| lead =
| obtain =
| gallery =
| trivia =
| refs =
}}
</pre>
== Parameters ==
; name
: The name of the dye.
; minhex
: The hex value of the color display when the game's graphic is put the minimum. No need to type the # in the beginning.
; minhex
: The hex value of the color display when the game's graphic is put the maximum. No need to type the # in the beginning.
; location
:
; price
: The price the player has to pay.
; lead
: A short summary of the dye.
; obtain
: A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method.
; gallery
: A gallery of images showcasing the dye. Use the following format:
<pre>
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
</gallery>
</pre>
: See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag.
; trivia
: A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon.
; refs
: If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt>
06c0a9bc80b5040e12fc1a79adc9cde2241c1666
Red Dye
0
295
513
499
2023-11-27T15:57:33Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Red Dye
| minhex = <nowiki>ff9797</nowiki>
| maxhex = <nowiki>ffb5b4</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Red Dye Bottle.png|The Dye Bottle
Red Dye Showcase.png|Showcasing the Dye without accessories
Red Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
f8b817434f6649e0071ba60981a0b923ed7c1f7a
Yellow Dye
0
297
515
501
2023-11-27T15:58:20Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Yellow Dye
| minhex = <nowiki>fffd02</nowiki>
| maxhex = <nowiki>ffff07</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Yellow Dye Bottle.png|The Dye Bottle
Yellow Dye Showcase.png|Showcasing the Dye without accessories
Yellow Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
8de6e753f62962f871ebe295897da5ed29b165cb
Blue Dye
0
298
516
500
2023-11-27T15:58:32Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Blue Dye
| minhex = <nowiki>ccfaff</nowiki>
| maxhex = <nowiki>e7feff</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 100
| lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with.
| obtain =
*It is located in Dye Shop in [[Abyssal Sanctum Market]]
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Blue Dye Bottle.png|The Dye Bottle
Blue Dye Showcase.png|Showcasing the Dye without accessories
Blue Dye Full Showcase.png|Showcasing the Dye with accessories
Red Dye Location.png|The Dye's location
</gallery>
}}
c74ba66f618259cfb9da8e5838e1dacd49033b00
Deep Purple Dye
0
309
517
425
2023-11-27T15:58:51Z
Reduckilous
4
wikitext
text/x-wiki
{{Dyes
| name = Deep Purple Dye
| minhex = <nowiki>6301d5</nowiki>
| maxhex = <nowiki>6300d5</nowiki>
| location = [[Abyssal Sanctum Market]]
| price = 800
| lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn.
| obtain =
*It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]].
| gallery =
<gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">
Deep Purple Dye Bottle.png|The Dye Bottle
Deep Purple Dye Showcase.png|Showcasing the Dye without accessories
Deep Purple Dye Full Showcase.png|Showcasing the Dye with accessories
Deep Purple Dye Location.png|The Dye's location
</gallery>
}}
66e01d3320a6690575504c38d6c81e7ca9fdd52e
Echoes
0
352
519
473
2023-11-27T17:57:16Z
Reduckilous
4
still W.I.P
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:20%" scope="col" | Surrounding
!style="background-color:#3472AD" scope="col" | Location
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| 1
| [[File:1m Echo.png|250px]]
|
* Located in a small secluded room with many horizontal beam. Northwest of [[Abyssal Sanctum Market]]. West of the map.
* Can be quickly obtained by going backward from [[Sanctum Overlook]], then follow East to the echo.
|Easy
|-
| 23
| [[File:23m Echo.png|250px]]
|
* Located on a small bridge in the middle between [[Sanctum Overlook]] and [[Beginner's Grotto]], can be spotted and obtained easily.
|Easy
|-
| 24
| [[File:24m Echo.png|250px]]
|
* Located on an altar like place in the East of the map. Directly East from [[Beginner's Grotto]].
* Can be obtained by going left of the gate from [[The First Gate]] and fall down to the West onto the place where the echo lies.
|Easy
|-
| 40
| [[File:40m Echo.png|250px]]
|
* Located on a tall tower on the Northwest corner of the map. Northwest from [[Beginner's Grotto]].
* Can be obtained by going East from [[The Second Gate]] and then fall down to the tower where the echo lies.
|Easy
|-
| 63
| [[File:63m Echo.png|250px]]
|
* Located on a tall tower on the East of the map. Southeast from [[Beginner's Grotto]]. Behind the 20 Echo room.
* Can be obtained by going West from [[The First Gate]] and then [[Techs|Cancel Velocity]] down to the the bridge that is attached to the tower where the echo lies.
|Easy
|-
| 95
| [[File:95m Echo.png|250px]]
|
* Located on the third story of the building on the North of [[Beginner's Grotto]]
* Can be obtained by going South from [[Level 3 Ascent]] and falling down to the third story of the building where the echo lies.
|Medium
|-
| 126
| [[File:126m Echo.png|250px]]
|
* Located directly Infront of [[The First Gate]] and can be directly obtained from there.
|Easy
|-
| 136
| [[File:136m Echo.png|250px]]
|
* Located in the "pipe" in the West of the map, can be seen from [[The First Gate]].
* Can be obtained by falling down the North of [[Witness Store]] on to the pipe, and then entered through it's open end, and to the echo with a Another Player.
|Hard
|-
| 153
| [[File:153m Echo.png|250px]]
|
* Located on a tall tower that is Southeast on the map, Southwest from [[The First Gate]]
* Can be obtained by falling from the bridge between [[Plinko Overlook]] and [[Witness Store]], landing on the top of the tower where the echo lies.
|Medium
|-
| 168
| [[File:168m Echo.png|250px]]
|
* Located in the room directly west from [[Level 2 Ascent]] and can be directly obtained from there.
|Easy
|-
| 286
| [[File:286m Echo.png|250px]]
|
* Directly East from [[Plinko Overlook]] and can be directly obtained from there.
|Easy
|-
| 311
| [[File:311m Echo.png|250px]]
|
* Located in the Orb Vault next to [[Plinko Overlook]] and requires Another Player to obtain.
|Medium
|-
| 339
| [[File:339m Echo.png|250px]]
|
* Located on a big platform in the middle of [[Witness Store]] and [[The Second Gate]].
* Can be obtained by getting it on the normal route. Or falling on it from the Northern bridge on [[Tower of Isolation]]
|Easy
|-
| 362
| [[File:362m Echo.png|250px]]
|
* Located in the end of the small parkour course in the Southeast of the map. Upper East from [[Witness Store]].
* Can be obtained by falling to the parkour section from [[Tower of Isolation]] or [[Floor 4 Beginning]] and then completing it with Another Player.
|Medium
|-
| 411
| [[File:411m Echo.png|250px]]
|
* Located in the ceiling of the big room that comes before [[The Second Gate]].
* Can be obtained by going East of said room and climb up the small platform on the side of the entrance to the "Balcony" to the ceiling and then navigating to the echo from there.
|Medium
576687e77a13713dad184bf34558ac01aea2826b
520
519
2023-11-28T03:51:25Z
Reduckilous
4
I think that's all the current echos :3
wikitext
text/x-wiki
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Height
!style="background-color:#3472AD; Width:20%" scope="col" | Surrounding
!style="background-color:#3472AD" scope="col" | Location
!style="background-color:#3472AD; Width:15%" scope="col" | Difficulty
|-
| 1
| [[File:1m Echo.png|250px]]
|
* Located in a small secluded room with many horizontal beam. Northwest of [[Abyssal Sanctum Market]]. West of the map.
* Can be quickly obtained by going backward from [[Sanctum Overlook]], then follow East to the echo.
|Easy
|-
| 23
| [[File:23m Echo.png|250px]]
|
* Located on a small bridge in the middle between [[Sanctum Overlook]] and [[Beginner's Grotto]], can be spotted and obtained easily.
|Easy
|-
| 24
| [[File:24m Echo.png|250px]]
|
* Located on an altar like place in the East of the map. Directly East from [[Beginner's Grotto]].
* Can be obtained by going left of the gate from [[The First Gate]] and fall down to the West onto the place where the echo lies.
|Easy
|-
| 40
| [[File:40m Echo.png|250px]]
|
* Located on a tall tower on the Northwest corner of the map. Northwest from [[Beginner's Grotto]].
* Can be obtained by going East from [[The Second Gate]] and then fall down to the tower where the echo lies.
|Easy
|-
| 63
| [[File:63m Echo.png|250px]]
|
* Located on a tall tower on the East of the map. Southeast from [[Beginner's Grotto]]. Behind the 20 Echo room.
* Can be obtained by going West from [[The First Gate]] and then [[Techs|Cancel Velocity]] down to the the bridge that is attached to the tower where the echo lies.
|Easy
|-
| 95
| [[File:95m Echo.png|250px]]
|
* Located on the third story of the building on the North of [[Beginner's Grotto]]
* Can be obtained by going South from [[Level 3 Ascent]] and falling down to the third story of the building where the echo lies.
|Medium
|-
| 126
| [[File:126m Echo.png|250px]]
|
* Located directly Infront of [[The First Gate]] and can be directly obtained from there.
|Easy
|-
| 136
| [[File:136m Echo.png|250px]]
|
* Located in the "pipe" in the West of the map, can be seen from [[The First Gate]].
* Can be obtained by falling down the North of [[Witness Store]] on to the pipe, and then entered through it's open end, and to the echo with a Another Player.
|Hard
|-
| 153
| [[File:153m Echo.png|250px]]
|
* Located on a tall tower that is Southeast on the map, Southwest from [[The First Gate]]
* Can be obtained by falling from the bridge between [[Plinko Overlook]] and [[Witness Store]], landing on the top of the tower where the echo lies.
|Medium
|-
| 168
| [[File:168m Echo.png|250px]]
|
* Located in the room directly west from [[Level 2 Ascent]] and can be directly obtained from there.
|Easy
|-
| 286
| [[File:286m Echo.png|250px]]
|
* Directly East from [[Plinko Overlook]] and can be directly obtained from there.
|Easy
|-
| 311
| [[File:311m Echo.png|250px]]
|
* Located in the Orb Vault next to [[Plinko Overlook]] and requires Another Player to obtain.
|Medium
|-
| 339
| [[File:339m Echo.png|250px]]
|
* Located on a big platform in the middle of [[Witness Store]] and [[The Second Gate]].
* Can be obtained by getting it on the normal route. Or falling on it from the Northern bridge on [[Tower of Isolation]]
|Easy
|-
| 362
| [[File:362m Echo.png|250px]]
|
* Located in the end of the small parkour course in the Southeast of the map. Upper East from [[Witness Store]].
* Can be obtained by falling to the parkour section from [[Tower of Isolation]] or [[Floor 4 Beginning]] and then completing it with Another Player.
|Medium
|-
| 411
| [[File:411m Echo.png|250px]]
|
* Located in the ceiling of the big room that comes before [[The Second Gate]].
* Can be obtained by going East of said room and climb up the small platform on the side of the entrance to the "Balcony" to the ceiling and then navigating to the echo from there.
|Medium
|-
| 426
| [[File:426m Echo.png|250px]]
|
* Located on an "altar" Northeast of [[The Second Gate]], very easy to spot.
* Can be obtained by going right up to the actual gate, then turn North before you enter to the parkour section of the echo.
|Easy
|-
| 498
| [[File:498m Echo.png|250px]]
|
* On top of the hut at the start of the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]]. East of the map.
* Can be obtained by climbing the mini platform next to the hut, requires Another Player.
|Easy
|-
| 583
| [[File:583m Echo.png|250px]]
|
* Located to a platform on the ceiling of the first parkour section after [[Level 3 Ascent]]. Northeast of the map.
* Can be obtained by climbing the Southwest 2 player part of the parkour section with another player and reach the end of that course.
|Hard
|-
| 597
| [[File:597m Echo.png|250px]]
|
* Located on the platform directly above [[Tower of Isolation]].
* Can be obtained by going to the end of the bridge that goes after [[Tower of Isolation]], then parkour through the roof of the bridge with Another Player back to where the echo is.
|Medium
|-
| 823
| [[File:823m Echo.png|250px]]
|
* Located in the huge Eastern water tank in [[Floor 4 Beginning]]-[[Refinery Overlook]]. Northwest of the map.
* Can be obtained by following the normal route through [[Floor 4 Beginning]], then deviate to the South after reaching the Northwest part of the section to fall down and into the tank.
|Medium
|-
| 939
| [[File:939m Echo.png|250px]]
|
* Located on top of the huge Southwest tower right after [[Floor 4 Beginning]].
* Can be obtained by dropping down onto the tower from the conveyor belts right after [[Refinery Overlook]]
|Easy
|-
| 951
| [[File:951m Echo.png|250px]]
|
* Located in a room in the Northeast corner of [[Floor 4 Beginning]]-[[Refinery Overlook]].
* Can be obtained by going on the normal route, then go to the very Northeast corner of the map and enter the room through an entrance on the South.
|Medium
|-
| 1007
| [[File:1007m Echo.png|250px]]
|
* Located on a high platform above a closed door in the North of [[Floor 4 Beginning]]-[[Refinery Overlook]].
* Can be obtained by going Northwest from [[Level 4 Ending]] and fall down to the platform where the echo lies.
|Medium
|-
| 1142
| [[File:1142m Echo.png|250px]]
|
* Located on a 2 player parkour course on the South of [[Refinery Overlook]]-[[Level 4 Ending]].
* Can be obtained by going to the South end from [[Level 4 Ending]] and drop down on the East edge, onto the platform where the echo lies.
|Medium
|-
| 1231
| [[File:1231m Echo.png|250px]]
|
* Located on a tank right above the roof of [[Refinery Overlook]]. Southeast of the map.
* Can be obtained by going to the South end from [[Level 4 Ending]] and [[Techs|Cancel Velocity]] down to the East from there to land on the echo.
|Medium
33dfedc0f8f9181c5280d0d131797e183bcd6794
Witnesses
0
384
521
2023-11-28T04:53:43Z
Reduckilous
4
Created page with "Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are Each witness have their own respective tank when bou..."
wikitext
text/x-wiki
Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs.
The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are
Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
e80f9804ef071608a6304e29c229ea1d33ae48df
522
521
2023-11-28T04:55:58Z
Reduckilous
4
wikitext
text/x-wiki
Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs.
The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.
Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
a1c84b23c5bff1fe105ec194ea3ce2b4d92b6c0d
523
522
2023-11-28T06:02:47Z
Reduckilous
4
Seperating the text for ease of reading
-Reduck from school
wikitext
text/x-wiki
<p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p>
<p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p>
<p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p>
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
640398bbdd08bf3f16ec80b86f336ec959e83d73
524
523
2023-11-28T06:43:44Z
Reduckilous
4
/* Faces and Colors */
wikitext
text/x-wiki
<p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p>
<p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p>
<p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p>
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
==Trivia==
*The 3 starter witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games.
*Witnesses are first named "Pets" but later was rejected due to playtesters highly disagreeing with having straight up "Pets" in Abyssal.
4fa2dca87e1081c7138009068b905c3100293e6d
525
524
2023-11-28T13:27:28Z
Reduckilous
4
wikitext
text/x-wiki
<p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p>
<p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p>
<p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p>
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
==Names==
Here are a list of all the possible name a Witness can have.
# Abyssinia
# Abyssite
# Abyssium
# Abyssolus
# Abyssquill
# Abyssus
# Abysswing
# Aether
# Amethysta
# Argentum
# Artemis
# Asterea
# Astral
# Astrid
# Aurorae
# Aurorium
# Azura
# Calypsa
# Celestia
# Cerulean
# Chronos
# Cinderel
# Cobalt
# Cryoterra
# Crystaria
# Cynosure
# Dracora
# Drift
# Duskmaw
# Echo
# Eclipse
# Ecliptis
# Elyssira
# Elyssium
# Ember
# Embera
# Ethera
# Flamara
# Geminara
# Glimmer
# Hallow
# Hydronix
# Icarus
# Ignacia
# Ignis
# Ishtar
# Lithora
# Lumis
# Lumithar
# Lunara
# Lunaris
# Lustra
# Marisca
# Marlowe
# Mica
# Minerva
# Nebulae
# Nexara
# Nihilius
# Nimbus
# Nivalis
# Nocturne
# Nova
# Novaflare
# Nyx
# Nyxalis
# Oblivis
# Obscura
# Obscuris
# Obsidian
# Oceania
# Ombrosa
# Onyx
# Orin
# Pebble
# Phosphor
# Pyronyx
# Quartz
# Quicksilver
# Rune
# Sable
# Sablethorn
# Seraph
# Serenitea
# Serpentis
# Shadow
# Solanum
# Solara
# Solarix
# Solstice
# Solunara
# Spectralis
# Stardust
# Sylvanix
# Sylvaris
# Tempest
# Tenebris
# Terra
# Terraquill
# Thalassa
# Thundara
# Umbra
# Valora
# Verdant
# Verdelith
# Vesper
# Vesperion
# Virelia
# Vortex
# Zenith
# Zenithar
# Zephyr
# Zephyra
# Zirelia
# Zyphrion
==Trivia==
*The 3 starter witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games.
*Witnesses are first named "Pets" but later was rejected due to playtesters highly disagreeing with having straight up "Pets" in Abyssal.
2baff2c14fb53c1a2a09949233225607f9e3b181
526
525
2023-11-29T13:34:53Z
Reduckilous
4
Cleaning up abit
wikitext
text/x-wiki
Witnesses are your 'Companion' in the game, designed to make the main route slightly easier to navigate. They can be purchased at the [[Witness Store]] and provide a variety of buffs and utility quirks to assist you. However, each witness requires you to harvest Energy Orbs with them to activate their buffs.
The three starter witnesses (Piconium, Luxura, Jellite) can be acquired for free after unlocking [[The First Gate]]. They are essential for progressing to the [[Level 2 Ascent]]. However, you can entirely skip them by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]]. If you choose this method, you can later obtain one of the witnesses from the [[Witness Store]] for free.
Each witness has its own respective tank upon purchase and cannot be placed in another tank, even if that tank is empty. Witnesses do not provide buffs during Challenges and will be sent to their own tank if you activate a challenge. However, you can re-equip your witness at the [[Witness Store]] during the challenge to regain access to their buffs.
==Buffs==
Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1.
{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;"
|-
!style="background-color:#3472AD; Width:10%" scope="col" | Stat
!style="background-color:#3472AD; Width:30%" scope="col" | Ability
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values
!style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values
|-
|Run Speed
|Increases normal walking speed.
|1 - 3
|4 - 6
|7 - 10
|-
|Jump Height
|Increases how high you can jump.
|1 - 3
|4 - 6
|7 - 10
|-
|Energy Conservation
|Decrease the energy you spent on Rewinding, Using ability, etc
|1 - 3
|4 - 6
|7 - 10
|-
|Weight
|Slow the speed at which you fall, also add a small upward force, making you jump slightly higher.
|(-1) - (-3)
|(-4) - (-6)
|(-7) - (-10)
|-
|Dash Ability
|Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance.
| False
| False
| True
|}
==Faces and Colors==
Witnesses have their own face and color when bought but can be changed with Abyssal Energy based on the Mask or Dye you are using during the change. Some Masks do not provide a face to witnesses, such as those obtained from challenges and certain masks from the Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks.
(will add a table of possible faces here later)
==Names==
Here are a list of all the possible name a Witness can have.
# Abyssinia
# Abyssite
# Abyssium
# Abyssolus
# Abyssquill
# Abyssus
# Abysswing
# Aether
# Amethysta
# Argentum
# Artemis
# Asterea
# Astral
# Astrid
# Aurorae
# Aurorium
# Azura
# Calypsa
# Celestia
# Cerulean
# Chronos
# Cinderel
# Cobalt
# Cryoterra
# Crystaria
# Cynosure
# Dracora
# Drift
# Duskmaw
# Echo
# Eclipse
# Ecliptis
# Elyssira
# Elyssium
# Ember
# Embera
# Ethera
# Flamara
# Geminara
# Glimmer
# Hallow
# Hydronix
# Icarus
# Ignacia
# Ignis
# Ishtar
# Lithora
# Lumis
# Lumithar
# Lunara
# Lunaris
# Lustra
# Marisca
# Marlowe
# Mica
# Minerva
# Nebulae
# Nexara
# Nihilius
# Nimbus
# Nivalis
# Nocturne
# Nova
# Novaflare
# Nyx
# Nyxalis
# Oblivis
# Obscura
# Obscuris
# Obsidian
# Oceania
# Ombrosa
# Onyx
# Orin
# Pebble
# Phosphor
# Pyronyx
# Quartz
# Quicksilver
# Rune
# Sable
# Sablethorn
# Seraph
# Serenitea
# Serpentis
# Shadow
# Solanum
# Solara
# Solarix
# Solstice
# Solunara
# Spectralis
# Stardust
# Sylvanix
# Sylvaris
# Tempest
# Tenebris
# Terra
# Terraquill
# Thalassa
# Thundara
# Umbra
# Valora
# Verdant
# Verdelith
# Vesper
# Vesperion
# Virelia
# Vortex
# Zenith
# Zenithar
# Zephyr
# Zephyra
# Zirelia
# Zyphrion
==Trivia==
*The 3 starter Witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games.
*Witnesses were initially referred to as 'Pets,' but this term was later rejected due to strong disagreement from playtesters who felt that having straightforward 'Pets' in Abyssal was not suitable.
f7b19b4c3e97513dbdaaf4b945d1988274a40101